hdoj 1719 Friend【数学题】

来源:互联网 发布:湖北大数据问责汇报 编辑:程序博客网 时间:2024/05/22 06:17

Friend

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2207    Accepted Submission(s): 1108


Problem Description
Friend number are defined recursively as follows.
(1) numbers 1 and 2 are friend number;
(2) if a and b are friend numbers, so is ab+a+b;
(3) only the numbers defined in (1) and (2) are friend number.
Now your task is to judge whether an integer is a friend number.
 

Input
There are several lines in input, each line has a nunnegative integer a, 0<=a<=2^30.
 

Output
For the number a on each line of the input, if a is a friend number, output “YES!”, otherwise output “NO!”.
 

Sample Input
31312112131
 

Sample Output
YES!YES!NO!
 

Source
2007省赛集训队练习赛(2)
 

分析:
1.ab+a+b = ab+a+b+1-1 = (a+1)*(b+1)-1 ;

令a = (a1+1)*(a2+1)-1;

b = (b1+1)*(b2+1)-1;

代入原式中可得:n = (a1+1)*(b1+1)*(a2+1)*(b2+1)-1;

因为原式的朋友数都是由1,2推到出来的

所以递推到最底层,那么(a1+1)*(b1+1)*(a2+1)*(b2+1)肯定是2,3的倍数(即是1+1,2+1)

所以最后就是要解决n+1得到的数到底是不是只有2,3这些因子

 代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){    __int64 n;    while(scanf("%I64d",&n)!=EOF)    {        if(!n)        {        printf("NO!\n");        continue;        }        n++;               while(n%2==0)               n/=2;               while(n%3==0)               n/=3;               if(n==1)               printf("YES!\n");               else               printf("NO!\n");    }    return 0;}


 


0 0
原创粉丝点击