题意:给出n,p,问杨辉三角形的第n+1行有多少个数字能被p整除,p是素数。
分析:杨辉三角形的第n+1行是由组合数c(n,k)组成的,k=0~n。
因此,我们要求c(n,k)中有多少个p的倍数。首先我们求n!中含有多少个素因子p。数量为:n/p+n/(p^2)+……
c(n,k)中含有素因子p的个数是,n!中的个数 - (n-k)!中的个数 - k!中的个数(结果为非负整数)
我们要求有多少k使得c(n,k)不能被p整除,所以我们要c(n,k) 不包含素因子p,让上式为0,即:n/p+n/(p^2)+…… = (n-k)/p + (n-k)/(p^2) + ...... + k/p + k/(p^2) + ...
若a=b+c,则有a/p >= b/p + c/p。因此n/(p^i)>=(n-k)/(p^i) + k/(p^i)。由两个式子可推出n/(p^i)=(n-k)/(p^i) + k/(p^i)
n,(n-k),k在p进制下的最高位为m。因为之前结论有n/(p^m)=(n-k)/(p^m) + k/(p^m),所以,在p进制下,n最高位等于k和n-k的最高位的和
令i=m-1,有n/(p^i)=(n-k)/(p^i) + k/(p^i),即在p进制下,n高两位等于k和n-k的高两位的和。又最高位也相等,所以第二高位也相等。
依次类推,可知在p进制下,n的第i位等于n-k的第i位加上k的第i位。
题意要我们求k有多少种取值,k的第i位有n的第i位+1种取值(0~n的第i位+1)。所以把各个位的取值方法相乘即得k的使得c(n,k)不被p整除的取值数量。
由于以上过程均为等价过程,所以此结果,即为最终结果。
View Code
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int n, p; int main() { // freopen("t.txt", "r", stdin); int t = 0; while (scanf("%d%d", &p, &n), n | p) { t++; int ans = 1; while (n) { ans *= n % p + 1; ans %= 10000; n /= p; } printf("Case %d: %04d\n", t, ans); } return 0; }