SGU 169 Numbers(傻逼题)

来源:互联网 发布:sql如何查询重复的数据 编辑:程序博客网 时间:2024/04/29 12:43



题目大意: 
P(n)表示n每一位数的乘积。
比如,P(1243) = 1 * 2 * 4 * 3;
P(1243) = 1 * 2 * 4 * 3 = 24; P(198501243) = 0. 
如果P(n)!= 0 并且 n mod P(n) = 0,称n为一个good number。
如果n和n+1都是good number,则称n为一个perfect number。


现在给你一个数K,计算位数为K的perfect number的个数。
1 <= K <= 1000000


样例:
Input
1
Output
8


题解:
这K是有点大啊。 于是只能找找这些数有什么规律了。
假设n是一个K位的perfect number,n 从大到小每一位分别为 a1 a2 a3 ... al
则有 n = T1 * a1 * a2 * a3 * ... * ak。
因为 n + 1 为good number, 就只有最后一位与n 不同。
n + 1 = T2 * a1 * a2 * a3 * ... * (ak + 1)
(n + 1) - (n) = a1 * a2 * a3 .. * a(k - 1) * (T1 * ak + T2 - T1 * ak) = 1
可以看出 a1 * a2 * a3 ... * a(k - 1) = 1, 那么这个数的前 k - 1 位都是1.
那么我们来讨论ak就行了:
ak = 1,P(n) = 1,good number
ak = 2,P(n) = 2,good number
ak = 3, P(n) = 3,如果(k - 1)% 3 == 0, good number
ak = 4,P(n) = 4,最后两位14,显然不行。
ak = 5,P(n) = 5, good number
ak = 6,P(n) = 6,如果(k - 1)% 3 == 0, good number
ak = 7,P(n) = 7, 
这个略蛋疼,(1111...10 + 7) % 7 == 0, 就考虑111...11 % 7.
那么到底是多少个1呢,本人数学水平有限,写了个程序试了试。发现1的个数是6的倍数时 11...1 % 7 == 0.
就是说 如果(k - 1)% 6 == 0,good number
ak = 8,P(n) = 8,4不行,所以8也不行。
ak = 9,P(n) = 9,如果(k - 1) % 9 == 0, good number


然后就可以perfect number了。


#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int p[10];int k;int main() {scanf("%d", &k);p[1] = 1;p[2] = 1;if((k - 1) % 3 == 0) p[3] = 1;if(k == 1) p[4] = 1;p[5] = 1;if((k - 1) % 3 == 0) p[6] = 1;if((k - 1) % 6 == 0) p[7] = 1;if(k == 1) p[8] = 1;if((k - 1) % 9 == 0) p[9] = 1;int ans = 0;for(int i = 0; i < 9; i++) if(p[i] && p[i + 1]) ans++;printf("%d\n", ans);return 0;}


0 0
原创粉丝点击