HDU 2601 An easy problem 因式分解
2014-03-18 20:46
369 查看
点击打开链接
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5726 Accepted Submission(s): 1394
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..
![](http://acm.hdu.edu.cn/data/images/C154-1002-1.jpg)
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
i*j+i+j=n => (i+1)*(j+1)=n+1 所以只要求出(n+1)/(i+1)求出有多少j符合情况就行了。题目中要求j是大于0的,所以要判断求出都j是否大于0,可是一旦加上这个判断,就会超时。
通过证明,这个判断确实是多余的,因为一旦(n+1)%(i+1)==0,就能求出j+1,因为i>0,所以for循环是从2开始的(因为是(i+1)),而i<=j,所以只需要判断到根号n就可以了,因为到了根号n以后情况就重复了,如2*6与6*2只有一种符合情况。那么如果j只有两种情况了,一种是j==0,一种是j>0,显然我们求的是j>0都情况,那么j=0的时候,也就是(i+1)*(0+1)=n+1,可以求出i==n,而for循环只循环到根号n,所以这种情况不可能发生。说的有点罗嗦了。
不过即使是这样,也跑了2000多ms。另外是不是只要求出n+1所有的因子小于等于根号n+1的个数就是次题都解?
An easy problem
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5726 Accepted Submission(s): 1394
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..
![](http://acm.hdu.edu.cn/data/images/C154-1002-1.jpg)
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
i*j+i+j=n => (i+1)*(j+1)=n+1 所以只要求出(n+1)/(i+1)求出有多少j符合情况就行了。题目中要求j是大于0的,所以要判断求出都j是否大于0,可是一旦加上这个判断,就会超时。
通过证明,这个判断确实是多余的,因为一旦(n+1)%(i+1)==0,就能求出j+1,因为i>0,所以for循环是从2开始的(因为是(i+1)),而i<=j,所以只需要判断到根号n就可以了,因为到了根号n以后情况就重复了,如2*6与6*2只有一种符合情况。那么如果j只有两种情况了,一种是j==0,一种是j>0,显然我们求的是j>0都情况,那么j=0的时候,也就是(i+1)*(0+1)=n+1,可以求出i==n,而for循环只循环到根号n,所以这种情况不可能发生。说的有点罗嗦了。
不过即使是这样,也跑了2000多ms。另外是不是只要求出n+1所有的因子小于等于根号n+1的个数就是次题都解?
//2390MS 228K #include<stdio.h> #include<math.h> int main() { int t; scanf("%d",&t); while(t--) { __int64 n,nn; scanf("%I64d",&n); n++; int count=0; nn=sqrt(n); for(int i=2;i<=nn;i++) if(n%i==0)count++; printf("%d\n",count); } return 0; }
相关文章推荐
- hdu 2601 An easy problem
- hdu 2601 An easy problem
- HDU 2601 An easy problem(数学)
- hdu 2601 An easy problem
- HDU 2601 An easy problem(数学转换)
- HDU-2601-An easy problem【思维】
- HDU-2601-An easy problem
- HDU-2601 An easy problem
- HDU 2601:An easy problem【数学】
- hdu 2601 An easy problem
- HDU-2601-An easy problem
- HDU 2601 An easy problem(求因数)
- hdu 2601 An easy problem
- HDU 2601 An easy problem (数学)
- HDU 2601 An easy problem(暴力枚举/质因子分解)
- HDU 2601 An easy problem
- Hdu 2601 An easy Problem
- HDU 2601 An easy problem (数论)
- 数学 hdu 2601 (An easy problem)
- An easy problem hdu 2601