P2290 __int128不应该会乘爆呀,感觉#6的数据是不是大了
查看原帖
P2290 __int128不应该会乘爆呀,感觉#6的数据是不是大了
29354
CodyTheWolf楼主2020/9/27 23:59

RT WA on #6 大概思路是反正不超过101710^{17},开int128然后强行搞逆元((但#6WA了说明应该乘爆了x

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
const __int128 MOD=1e17+9;

inline __int128 FastPow(__int128 x,__int128 y)
{
    __int128 ans=x!=0;
    for(;y;x=x*x%MOD,y>>=1)
        if(ans&1) ans*=x,ans%=MOD;
    return ans%MOD;
}

inline void Print(__int128 x)
{
    if(x>9) Print(x/10);
    putchar(x%10+'0');
}

signed main(void)
{
    cin>>n;
    if(n==1) {scanf("%d",&n)&&n?puts("0"):puts("1");return 0;}
    __int128 ans=1;
    int sum=0;
    for(int i=1;i<=n-2;i++)
    {
    	__int128 temp=i;
    	ans*=temp,ans%=MOD;
	}
        
    for(int i=1,degree=0;i<=n;i++)
    {
        scanf("%d",&degree),sum+=degree-1;
        if(!degree) {puts("0");return 0;}
        if(degree==1) continue;
        __int128 fact=1; 
        for(int j=2;j<=degree-1;j++)
        {
			__int128 temp=j;
			fact*=temp,fact%=MOD;
		}
		ans*=FastPow(fact,MOD-2),ans%=MOD;
    }
    if(sum!=n-2) {puts("0");return 0;}
    Print(ans);
    return 0;
}
2020/9/27 23:59
加载中...