• 题解:艾米利亚的魔法


    题目:http://cojs.tk/cogs/problem/problem.php?pid=2430

    题解:

    对于这道题可能有很多种做法,欢迎大家艹过去,可以用我标程写的降幂大法。

    注意费马小定理必须在模数是质数的情况下。所以要用降幂大法,一个比较直观的式子就是


    所以直接用这个方法就可以做了,还有一件事,那就是我们发现里面必须要用到组合数取摸,所以然而phi(p)=27092310,是个合数,如果直接组合数取摸的话,会跪(具体会跪倒什么程度我不太清楚,而且也没有试),所以要用到中国剩余定理,总而言之,这是一道比较综合的题

    代码如下

    #include <cstdio>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int mod = 54184622,MAXN = 1000005;
    ll N,G,Index,MM;
    ll pri[5]={2,3,5,7,129011};
    ll A[5],M[5],K[5],fact[5][MAXN],Inv[5][MAXN];
    inline ll gcd(ll a,ll b){return b == 0 ? a:gcd(b,a%b);}
    ll phi(ll x){
    	ll res=x,k=sqrt(x);
    	for(int i=2;i<k;++i){
    		if(x % i==0){
    			res-=res/i;
    			while(x%i==0)x/=i;
    		}
    		if(x<=1)break;
    	}
    	if(x>1) res -= res / x;
    	return res;
    }
    inline ll pow(ll a,ll t,ll p){
    	ll ret = 1;
    	for(;t;a=(a*a)%p,t>>=1) if(t&1) ret = (ret*a)%p;
    	return ret;
    }
    ll C(ll n,ll m,ll p,int i){
    	if(m > n) return 0;
    	return ( (fact[i][n]*Inv[i][m]) % p*Inv[i][n-m]) % p;
    }
    ll Lucas(ll n,ll m,ll p,int i){
    	if(m == 0) return 1;
    	return C(n % p,m % p,p,i)*Lucas(n/p,m/p,p,i) % p;
    }
    ll China(ll n,ll m){
    	if(m > n)return 0;
    	ll res = 0;
    	for(int i = 0;i < 5; ++i)
    		A[i]=Lucas(n,m,pri[i],i);
    	for(int i = 0;i < 5; ++i)
    		res = (res+A[i]*M[i]*K[i])%MM;
    	return res;
    }
    void Pre(){
    	for(int i=0;i<5;++i){
    		fact[i][0] = 1;
    		for(int j=1;j<=1000000;++j) fact[i][j] = (fact[i][j-1]*j)%pri[i];
    		for(int j=0;j<=1000000;++j) Inv[i][j] = pow(fact[i][j],pri[i]-2,pri[i]);
    	}
    }
    int main(){
    	freopen("aimiliyademagic.in","r",stdin);
    	freopen("aimiliyademagic.out","w",stdout);
    	Pre();
    	scanf("%lld%lld",&N,&G);
    	ll p = phi(mod); MM = p;
    	for(int i=0;i<5;++i) M[i] = MM/pri[i];
    	for(int i=0;i<5;++i) K[i] = pow(M[i],pri[i]-2,pri[i]);
    	for(int i=1;i<=N;++i){
    		if( gcd(i,N) == 1){
    			Index += China(G,i);
    			Index %= p;
    		}
    	}
    	printf("%lld
    ",pow(N,Index+p,mod));
    	fclose(stdin);fclose(stdout);
    	return 0;
    }


    人就像命运下的蝼蚁,谁也无法操控自己的人生.
  • 相关阅读:
    班课6
    lesson one
    班课5
    ES6之Proxy及Proxy内置方法
    ES6模板字符串
    ES6之Symbol
    ES6对象及ES6对象简单拓展
    ES6函数的拓展
    ES6数组及数组方法
    ES6字符串方法
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6435562.html
Copyright © 2020-2023  润新知