HDoj-1719-Friend-巧算巧解

来源:互联网 发布:axure 浏览器插件 mac 编辑:程序博客网 时间:2024/06/05 10:33

Friend

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


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!
乍的一看没什么思路,其实这道题很简单,如果C 是Friend number ,则c=1 ,c=2,c=a*b+a+b;
关键是利用c=a*b+a+b;变形一下:c=(a+1)(b+1)-1;即 C+1=(a+1)(b+1);
a,b的最小值是1,2,则c若是Friend number,C+1肯定是2或3的倍数,循环求余!
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<queue>#include<stack>using namespace std;int main(){int n;while(~scanf("%d",&n)){if(n<1){printf("NO!\n");continue;}else{n=n+1;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
原创粉丝点击