社区讨论
求助:本地通过,交上去全部显示除0
P2480[SDOI2010] 古代猪文参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo2xw07l
- 此快照首次捕获于
- 2023/10/23 21:34 2 年前
- 此快照最后确认于
- 2023/10/23 21:34 2 年前
CPP
#include<bits/stdc++.h>
#define mod 999911659
#define ll long long
#define maxn 40004
#define fmod 999911658
using namespace std;
ll n,g;
ll f[5][maxn],invf[5][maxn],pmod[5]={0,2,3,4679,35617};
ll poww(ll x,ll k,ll p){
if(x%p==0) return 0;
ll ans=1;
//cout<<x<<" "<<k<<" "<<p<<endl;
while(k){
// cout<<x<<endl;
if(k&1) ans=ans*x%p;
x=x*x%p;
k>>=1;
}
return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,y,x);
y=-(a/b)*x;
return d;
}
void init(int len,int x){
ll p=pmod[x];
f[x][0]=1;
for(int i=1;i<=p-1;i++){
f[x][i]=f[x][i-1]*i%p;
}
invf[x][p-1]=poww(f[x][p-1],p-2,p);
for(int i=p-1;i>=1;i--){
invf[x][i-1]=invf[x][i]*i%p;
}
}
ll C(int x,int y,int p,int op){
if(y>x) return 0;
return f[op][x]*invf[op][y]%p*invf[op][x-y]%p;
}
ll lucas(ll x,ll y,ll p,int op){
if(x<p&&y<p){
return C(x,y,p,op);
}
return C(x%p,y%p,p,op)*lucas(x/p,y/p,p,op)%p;
}
ll b[5];
ll cntans(ll x){
for(int j=1;j<=4;j++){
b[j]+=lucas(n,x,pmod[j],j);
if(b[j]>pmod[j]) b[j]-=pmod[j];
}
}
ll work(){
ll ans=0;
for(int i=1;i*i<=n;i++){
if(n%i) continue;
cntans(i);
if(i*i!=n){
cntans(n/i);
}
}
for(int j=1;j<=4;j++){
ans=(ans+b[j]*(fmod/pmod[j])%fmod*poww(fmod/pmod[j],pmod[j]-2,pmod[j])%fmod)%fmod;
}
return ans;
}
int main(){
scanf("%lld%lld",&n,&g);
for(int i=1;i<=4;i++){
init(maxn-4,i);
}
printf("%lld",poww(g,work(),mod));
return 0;
}
对拍了1h,全部无差异。
回复
共 0 条回复,欢迎继续交流。
正在加载回复...