社区讨论

mx80分求助

P2480[SDOI2010] 古代猪文参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjh5cyd
此快照首次捕获于
2025/11/04 02:29
4 个月前
此快照最后确认于
2025/11/04 02:29
4 个月前
查看原帖
Wa on 5,7,16,18
CPP
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int L = 999911658;
ll n,g;
ll ysh[50005],tot;
ll fac[50005][5],com[5],Pow;
ll a[5]={0,2,3,4679,35617};

void Exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1,y=0; return;
	}
	Exgcd(b,a%b,x,y);
	ll t=x; x=y,y=t-(a/b)*y;
}
ll ksm(ll x,ll k,ll p){
	ll res=1;
	while(k){
		if(k&1) res=res*x%p;
		x=x*x%p,k>>=1;
	} return res;
}
ll C(ll n,ll m,ll i){
	if(n<m) return 0;
	return fac[n][i]*ksm(fac[m][i],a[i]-2,a[i])%a[i]*ksm(fac[n-m][i],a[i]-2,a[i])%a[i];
}
ll lucas(ll n,ll m,ll i){
	if(m==0) return 1;
	return C(n%a[i],m%a[i],i)*lucas(n/a[i],m/a[i],i)%a[i];
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>g;
    if(g==L+1){
        cout<<0; return 0;
    }
	fac[0][1]=fac[0][2]=fac[0][3]=fac[0][4]=1;
	for(int i=1;i<=4;i++)
		for(int j=1;j<=35617;j++) fac[j][i]=fac[j-1][i]*j%a[i];
	for(int i=1;i*i<n;i++){
		if(n%i==0){
			ysh[++tot]=i;
			ysh[++tot]=n/i;
		}
	}
	if(sqrt(n)*sqrt(n)==n) ysh[++tot]=sqrt(n);
	for(int i=1;i<=4;i++)
		for(int j=1;j<=tot;j++)
			com[i]=(com[i]+lucas(n,ysh[j],i))%a[i];
	for(int i=1;i<=4;i++){
		ll m=L/a[i],x,y;
		Exgcd(m,a[i],x,y);
		x=(x%a[i]+a[i])%a[i];
		Pow=(Pow+m*x%L*com[i]%L)%L;
	}
	cout<<ksm(g,Pow,L+1);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...