程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2601 An easy problem 因式分解

HDU 2601 An easy problem 因式分解

編輯:C++入門知識

點擊打開鏈接

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 <= 1010).
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;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved