Friend
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1139 Accepted Submission(s): 558
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.
(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
3 13121 12131
Sample Output
YES! YES! NO!
Source
Recommend
lcy
题意:
①1,2都是friend数
②如果a,b都是friend数,那么ab+a+b也是friend数
任务:判断一个数n是不是friend数 (0<=n<=2^30)
设a, b都是friend数,
那么可以生成一个friend数 x = ab+a+b = (a+1)(b+1)-1
设c, d都是friend数,
那么可以生成一个friend数 y = (c+1)(d+1)-1
由x,y又可以生成friend数n = (x+1)(y+1)-1
代入得:n = [(a+1)(b+1)][(c+1)(d+1)]-1
1,2生成的是 (1+1)(2+1)-1;
1,1生成的是 (1+1)^2 - 1;
2,2生成的是 (2+1)^2 - 1;
由递归理解可知friend数n = [(1+1)^x * (2+1)^y] - 1;
code:
1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <sstream> 5 #include <algorithm> 6 #include <string> 7 #include <set> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 #include <cstdio> 14 #include <cstdlib> 15 #include <cstring> 16 #include <cmath> 17 #include <ctime> 18 #include <ctype.h> 19 using namespace std; 20 21 int main() 22 { 23 int n; 24 while(~scanf("%d",&n)) 25 { 26 n++; 27 int x,y; 28 x=y=0; 29 while(n%2==0) 30 { 31 n/=2; 32 x++; 33 } 34 while(n%3==0) 35 { 36 n/=3; 37 y++; 38 } 39 if(n==1&&(x>0||y>0)) 40 printf("YES!\n"); 41 else 42 printf("NO!\n"); 43 } 44 return 0; 45 }