zoukankan      html  css  js  c++  java
  • 【SDOI 2010】 古代猪文

    【题目链接】

               https://www.lydsy.com/JudgeOnline/problem.php?id=1951

    【算法】

                欧拉定理+中国剩余定理 + lucas定理

    【代码】

             

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXD 40000
    typedef long long ll;
    const ll P = 999911659;
    const ll m[4] = {2,3,4679,35617};
    
    ll i,j,n,q,cnt,ans,x;
    ll a[10],factor[100010];
    ll fac[MAXD+1][5];
    
    inline void exgcd(ll a,ll b,ll &x,ll &y)
    {
            if (b == 0)
            {
                    x = 1;
                    y = 0;    
            }    else
            {
                    exgcd(b,a%b,y,x);
                    y -= a / b * x;
            }
    } 
    inline ll CRT()
    {
            int i;
            ll res = 0,M,T,x;
            for (i = 0; i < 4; i++)
            {
                    M = (P - 1) / m[i];
                    exgcd(M,m[i],T,x);
                    T = (T % m[i] + m[i]) % m[i];
                    res = (res + (a[i] * M % (P - 1) * T % (P - 1)) % (P - 1)) % (P - 1);
            }
            return res;
    }
    inline ll power(ll a,ll n,ll p)
    {
            ll b = a,res = 1;
            while (n)
            {
                    if (n & 1) res = res * b % p;
                    b = b * b % p;
                    n >>= 1;
            }
            return res;
    }
    inline void init()
    {
            int i,j;
            for (i = 0; i < 4; i++) fac[0][i] = 1;
            for (i = 1; i <= MAXD; i++)
            {
                    for (j = 0; j < 4; j++)
                    {
                            fac[i][j] = fac[i-1][j] * i % m[j];
                    }
            }
    }
    inline ll C(ll x,ll y,ll p)
    {
            if (x < y) return 0;
            if (y == 0) return 1;
            return fac[x][p] * power(fac[y][p]*fac[x-y][p]%m[p],m[p]-2,m[p]) % m[p];    
    } 
    inline ll lucas(ll x,ll y,ll p)
    {
            if (y == 0) return 1;
            else return lucas(x/m[p],y/m[p],p) * C(x%m[p],y%m[p],p) % m[p]; 
    }
    int main() 
    {
        
            scanf("%lld%lld",&n,&q);
            if (q == P)
            {
                    printf("0
    ");
                    return 0;
            }
            cnt = 0;
            for (i = 1; i <= sqrt(n); i++)
            {
                    if (n % i == 0)
                    {
                            factor[++cnt] = i;
                            if (i * i != n) factor[++cnt] = n / i;
                    }        
            }
            init();
            for (i = 1; i <= cnt; i++)
            {
                    for (j = 0; j < 4; j++)    
                    {
                            a[j] = lucas(n,factor[i],j);    
                    }    
                    x = (x + CRT()) % (P - 1);
            }
            ans = power(q,x,P);
            printf("%lld
    ",ans);
            
            return 0;
        
    }
     
  • 相关阅读:
    开发PHP扩展(一)
    ssh 使用技巧
    安装scribe
    PHP扩展中定义一个类
    PHP扩展的加载流程
    PHP扩展中访问全局变量$_POST,$_GET,$_SERVER等
    PHP的HashTable(一)
    PHP的HashTable(二)
    MVC ScriptBundle自定义排序。
    解决bootstrap和easyUI部分css类冲突问题。
  • 原文地址:https://www.cnblogs.com/evenbao/p/9291940.html
Copyright © 2011-2022 走看看