zoukankan      html  css  js  c++  java
  • HDOJ1719 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 }
  • 相关阅读:
    多项式学习笔记(二) NTT
    矩阵树定理学习笔记
    拓展BSGS 学习笔记
    P2257 YY的GCD
    P1891 疯狂的lcm
    友链
    关于我
    焚燃指间の回忆
    洛谷P4180
    洛谷P2292
  • 原文地址:https://www.cnblogs.com/XBWer/p/2633361.html
Copyright © 2011-2022 走看看