Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 3977 | Accepted: 1002 |
Description
比如当N=2,M=18时,持有卡片(10, 15, 18)的跳蚤,就可以完成任务:他可以先向左跳10个单位长度,然后再连向左跳3次,每次15个单位长度,最后再向右连跳3次,每次18个单位长度。而持有卡片(12, 15, 18)的跳蚤,则怎么也不可能跳到距他左边一个单位长度的地方。
当确定N和M后,显然一共有M^N张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。
Input
Output
Sample Input
2 4
Sample Output
12
Hint
(1, 1, 4), (1, 2, 4), (1, 3, 4), (1, 4, 4), (2, 1, 4), (2, 3, 4),
(3, 1, 4), (3, 2, 4), (3, 3, 4), (3, 4, 4), (4, 1, 4), (4, 3, 4)
Source
/*
http://acm.pku.edu.cn/JudgeOnline/problem?id=1091
这题考虑到了数论和组合数学的相关知识,题目大意是给定给定两个整数n和m, 求出长度为n+1的满足条件的数列data的个数,数列要求如下:
1)1 <= data[i] <= m, for 1<=i<=n
2)data[n+1] = m;
3)这个n+1个数满足: 存在整数 x1, x2, ..., xn, xn + 1, 满足 x1 * data[1] + x2 * data[2] + ... + xn+1 * data[n + 1] = 1;
根据数论的知识,n个数的最大公约数规定为这n个数线性和的最小自然数,所以此题就是要求最大公约数为1的数列的个数
由于data[n + 1] = m, 是已知的,所以这题可以用组合数学鸽巢原理的知识来解,步骤如下:
1)求出m的所有质约数,假设有k个如果这n + 1个数的最大公约数不是1,m至少含有一个质约数,这个质约数也是前n个数的约数
2)序列的总个数为 m ^ n;
3)设t(n)表示 能够整除 任意n个m的质约数且<=m的数的个数
利用容斥原理可知公约数不为1的数列的个数为 f = t(1) - t(2) + t(3) - ... + (-1) ^ (k - 1) t(k)
4) 符合要求的序列个数为 m ^ n - f
代码如下:
*/