poj3146

题意:给出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;
}
posted @ 2012-11-15 16:42  金海峰  阅读(288)  评论(0编辑  收藏  举报