• SGU-169 Numbers(找规律)


    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=169

    解题报告:

    P(n)定义为n的所有位数的乘积,例如P(1243)=1*2*3*4=24,然后如果P(n)!=0且n mod P(n) = 0,则称n为good number.
    如果n和n+1都为good numbers,则称n为perfect number。然后给出位数k(1<=k<=1000000),找出位数为k的perfect number.
    题目给出的k范围很大,我每次看到这种题目都是不看直视的,这题看了一篇解题报告才A的,说明这类的题不是高精度就是有规律的,比如这题就是可以找到规律的:
    设n有i位,各位分别为a1,a2,...,ai,因为个位为9的数不可能为perfect number(因为n+1不是good number)。
    所以n+1的各位分别为a1+1, a2, a3, ... , ai
    因为要求n mod P(n) = 0,所以n = s*a1*a2*...*ai,类似的有n+1 = t*(a1+1)*a2*a3*...*ai
    所以(n+1)-n = 1 = [t*(a1+1)-s*a1]*a2*a3*...*ai
    所以可以推出a2,a3,... ,ai必都为1,则有a1 | n, (a1+1) | (n+1)
    所以只需考虑a1的情况,a1有8个取值,(考虑位数大于1的情况)
    a1=1时,显然是可以的。
    a1=2时,需要判断3能否整除n+1,因为前面有k-1个1,所以只需判断(k-1+3)%3是否等于0
    a1=3时,(a1+1)=4,显然4不能整除14,所以3不行
    a1=4同上也不行
    a1=5时,判断6能否整除n+1,显然与判断a1=3一样
    a1=6时,判断7能否整除n+1,经过简单的除法计算可以知道当前面1的个数(k-1)是6的倍数时才有7 | (n+1)
    a1=7时,8不能整除118,所以7不行

    还有一个要记住的就是输入为1时要特判

     1 #include<cstdio>
     2 int main()
     3 {
     4     int n;
     5     scanf("%d",&n);
     6     if(n == 1)
     7     {
     8         printf("8
    ");
     9                 return 0;
    10     }
    11     int ans = 1;
    12     if(!((n + 2) %  3))
    13     ans++;
    14     if(!((5*(n-2)+8) % 3))
    15     ans++;
    16     if(!((n-1) % 6))
    17     ans++;
    18     printf("%d
    ",ans);
    19 }
    View Code
  • 相关阅读:
    LeetCode 476 数字的补数
    MySQL与Java 整型数据映射
    TINYINT[M]、INT[M]和BIGINT[M]中M值的意义
    git删除本地分支
    git 初始化项目、创建本地分支、本地分支与远程分支关联
    Java 当文件不存在时自动创建文件目录和文件
    Java 在文件末尾追加内容
    免密自动登陆SAPGui
    SAP GUI770下载及安装
    notepad++格式化json,无法安装json插件
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3854657.html
Copyright © 2020-2023  润新知