前言
不知道为什么 (Yang Hui) 会变成 (Yang Yui)?就很棒
Description
Solution
我们设:
[n = a[k]*p^k + a[k-1]*p^{k-1} + … + a[1]*p + a[0]
]
[m = b[k]*p^k + b[k-1]*p^{k-1} + … + b[1]*p + b[0]
]
所以,
[C(n,m)\%p=prod_{i=0}^kC(a[i],b[i])\%p
]
由于 a,b 数组是 (p^i) 前的系数,所以对于任意 i,都有 (a[i]<p&&b[i]<p)。
又因为 p 是质数,所以无论 (a[i]!),(b[i]!),((a[i]-b[i])!) 都不能被 p 整除,所以 (C(a[i],b[i])) 不会被 p 整除。(后面讲反例)
(a[i]) 是已知的,而 (b[i]) 唯一的范围就是 (b[i]<=a[i]),不然结果就是 0。
Code
#include <cstdio>
typedef long long ll;
ll p = 10000, mod;
int read() {
int x = 0, f = 1; char s;
while((s = getchar()) > '9' || s < '0') if(s == '-') f = -1;
while(s <= '9' && s >= '0') {
x = (x << 1) + (x << 3) + (s ^ 48);
s = getchar();
}
return x * f;
}
int main() {
int ans, n;
for(int T = 1; ; ++ T) {
mod = read(), n = read();
if(! n && (! mod)) break;
ans = 1;
while(n) {
ans = (ans * (n % mod + 1)) % p;
n /= mod;
}
printf("Case %d: %04d
", T, ans);
}
return 0;
}