An easy problem(思维)

版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/83033432

Problem Description

When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of water plus 1 pile of dough ..” , “100 yuan buy 100 pig” .etc..


One day Teddy met a old man in his dream , in that dream the man whose name was“RuLai” gave Teddy a problem :

Given an N , can you calculate how many ways to write N as i * j + i + j (0 < i <= j) ?

Teddy found the answer when N was less than 10…but if N get bigger , he found it was too difficult for him to solve.
Well , you clever ACMers ,could you help little Teddy to solve this problem and let him have a good dream ?

Input

The first line contain a T(T <= 2000) . followed by T lines ,each line contain an integer N (0<=N <= 1010).

Output

For each case, output the number of ways in one line.

Sample Input

2

1

3

Sample Output

0

1

Author

Teddy

Source

HDU 1st “Vegetable-Birds Cup” Programming Open Contest

题意:求一个数N可以化为多少种    i * j + i + j (0 < i <= j)   的形式

思路:

两个for循环肯定超时,i * j + i + j = N可以化为 i * j + i + j + 1 = N + 1

即(i+1)*(j+1) = N + 1 (0 < i <= j)

所以,只要N + 1能被2到sqrt(N+1)之间的数整除,这样的表达式就会累加1次

Code :

#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#define mod 998244353
#define Max 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef long long ll;
const int maxn=105;
int main(){
    int n;
    ll num;
    ios::sync_with_stdio(false);
    while(cin>>n){
        for(int t = 0; t < n; t++){
            cin>>num;
            num += 1;
            int len = sqrt(num);
            int sum = 0;
            for(int j = 2; j <= len; j++){
                if(num % j == 0){
                    sum++;
                }
            }
            cout<<sum<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/83033432