zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java8接口新特性
    美团后台开发面试经验
    美团后台开发面试经验
    HashMap源码阅读之get/put/resize方法
    腾讯系统测试面试经验
    携程实习生春招面经-后台开发
    Python-if else流程判断
    python中信息拼接打印
    数据库查询-关于exists的使用
    关于网站防护的建议
  • 原文地址:https://www.cnblogs.com/rainydays/p/2771746.html
Copyright © 2011-2022 走看看