HDOJ---1719 Friend[数论]

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.
 

 

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 }

 

posted @ 2012-08-11 09:58  max_xbw  阅读(209)  评论(0编辑  收藏  举报