这个是 TJ 代码,可以 AC。
#include<iostream>
#define int __int128
using namespace std;
const int N=205,mod=100000000000000003ll;
int ksm(int x,int y)
{
int lcq=1,pw=x%mod;
for(int i=0;i<=62;i++,pw=pw*pw%mod)
if(y>>i&1)
lcq=lcq*pw%mod;
return lcq;
}
int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void print(int x)
{
if(x<=9)
cout<<(signed)(x);
else
{
print(x/10);
cout<<(signed)(x%10);
}
}
int jc[N],n,d[N],sum;
signed main(){
n=read();
if(n==0)
cout<<1,exit(0);
jc[0]=1;
for(int i=1;i<=n;i++)
{
jc[i]=jc[i-1]*i%mod;
d[i]=read();
sum+=d[i];
if((d[i]<1&&n!=1)||d[i]>=n)
cout<<0,exit(0);
}
if(sum!=n*2-2)
cout<<0,exit(0);
int ans=jc[n-2];
for(int i=1;i<=n;i++)
ans=ans*ksm(jc[d[i]-1],mod-2)%mod;
print(ans);
return 0;
}
但是把数组的定义位置给一下就 WA 了。
#include<iostream>
#define int __int128
using namespace std;
const int N=205,mod=100000000000000003ll;
int ksm(int x,int y)
{
int lcq=1,pw=x%mod;
for(int i=0;i<=62;i++,pw=pw*pw%mod)
if(y>>i&1)
lcq=lcq*pw%mod;
return lcq;
}
int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void print(int x)
{
if(x<=9)
cout<<(signed)(x);
else
{
print(x/10);
cout<<(signed)(x%10);
}
}
int n,d[N],jc[N],sum;
signed main(){
n=read();
if(n==0)
cout<<1,exit(0);
jc[0]=1;
for(int i=1;i<=n;i++)
{
jc[i]=jc[i-1]*i%mod;
d[i]=read();
sum+=d[i];
if((d[i]<1&&n!=1)||d[i]>=n)
cout<<0,exit(0);
}
if(sum!=n*2-2)
cout<<0,exit(0);
int ans=jc[n-2];
for(int i=1;i<=n;i++)
ans=ans*ksm(jc[d[i]-1],mod-2)%mod;
print(ans);
return 0;
}
难道全局数组的定义还有什么讲究不成?