【组合数的唯一分解定理】Uva1635

Posted on 2015-07-06 15:01  LLGemini  阅读(424)  评论(0编辑  收藏  举报

给出n、m,求得最终求和数列an=C(n-1,0)*x+ C(n-1,1)*x2+...+C(n-1,n-1)*xn;

若xi与m无关,则an除以m的余数与xi无关,即余数不含xi的项;

输入:n,m

输出:ans     //无关项的总数;

   xi1 xi2 ...  //无关项,升序

 

Tips:

对于组合数的唯一分解定理

由于10^5级别的组合数必然会存在很大的项(long long甚至double都无法保存),要求得其唯一分解式只能采取按递推式分步分解,代码如下:

bool check(int n, int j)//按照递推公式来计算C(n, j)唯一分解式各项的指数
{
    int num = fac[0][0]; //此为上步求得的素因子总数
    int a = n - j + 1;
    int b = j;
    for (int i = 1; i <= num; i++)
    {
        int p = fac[i][0];
        int&q = fac_c[i];
        ///计算分解式各项指数
        for (; a%p == 0; a /= p, q++);
        for (; b%p == 0; b /= p, q--);
    }
}

求完后比较各素因子指数与m唯一分解式的对应指数的大小即可