點擊打開鏈接
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..
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 <= 10
10).
Output
FZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vciBlYWNoIGNhc2UsIG91dHB1dCB0aGUgbnVtYmVyIG9mIHdheXMgaW4gb25lIGxpbmUuCgogCjxicj4KClNhbXBsZSBJbnB1dAoKPHByZSBjbGFzcz0="brush:java;">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
#include
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;
}