题目链接: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 }