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;
}