結果
問題 | No.1956 猫の額 |
ユーザー | testestest |
提出日時 | 2022-05-22 15:47:13 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 8,560 ms / 10,000 ms |
コード長 | 2,237 bytes |
コンパイル時間 | 455 ms |
コンパイル使用メモリ | 34,688 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-20 13:54:50 |
合計ジャッジ時間 | 72,605 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 5,595 ms
5,248 KB |
testcase_01 | AC | 87 ms
5,376 KB |
testcase_02 | AC | 5,576 ms
5,376 KB |
testcase_03 | AC | 199 ms
5,376 KB |
testcase_04 | AC | 8,059 ms
5,376 KB |
testcase_05 | AC | 6,678 ms
5,376 KB |
testcase_06 | AC | 8,560 ms
5,376 KB |
testcase_07 | AC | 4,142 ms
5,376 KB |
testcase_08 | AC | 4,396 ms
5,376 KB |
testcase_09 | AC | 371 ms
5,376 KB |
testcase_10 | AC | 3,863 ms
5,376 KB |
testcase_11 | AC | 1,852 ms
5,376 KB |
testcase_12 | AC | 4,126 ms
5,376 KB |
testcase_13 | AC | 11 ms
5,376 KB |
testcase_14 | AC | 809 ms
5,376 KB |
testcase_15 | AC | 138 ms
5,376 KB |
testcase_16 | AC | 4,561 ms
5,376 KB |
testcase_17 | AC | 85 ms
5,376 KB |
testcase_18 | AC | 637 ms
5,376 KB |
testcase_19 | AC | 2,932 ms
5,376 KB |
testcase_20 | AC | 2,951 ms
5,376 KB |
ソースコード
#include<stdio.h> #include<stdlib.h> #define ll long long #define NUM 3 ll inv(ll x, int mod){ if(x==1)return 1; return (1-inv(mod%x,x)*mod)/x+mod; } ll modpow(ll x,ll n,ll m){ if(n==0)return 1; ll ret=modpow(x,n/2,m); ret=ret*ret%m; if(n%2)return ret*x%m; return ret; } ll witness[]={2,7,61}; int isprime(int n){ if(n==2)return 1; if(n<2||n%2==0)return 0; ll d=(n-1)/(n-1&1-n); for(int i=0;i<3;i++){ if(witness[i]>=n)return 1; ll t=d; ll a=modpow(witness[i],t,n); if(a==1||a==n-1)continue; while(a!=n-1){ t*=2; a=a*a%n; if(t==n-1)return 0; if(a==1)return 0; } } return 1; } ll calc_primitiveroot(int P){ int remainder[32]={}; int cnt=0; int ord=P-1; for(ll i=2;i*i<=ord;i++)if(ord%i==0){ while(ord%i==0)ord/=i; remainder[cnt++]=P/i; } if(ord!=1)remainder[cnt++]=P/ord; for(ll g=2;;g++){ int flag=1; for(int i=0;i<cnt;i++)if(modpow(g,remainder[i],P)==1)flag=0; if(flag)return g; } } int garner(ll*r,ll*m,int M){ int n=NUM; ll k[NUM]; for(int i=0;i<n;i++){ ll a=0,b=1; for(int j=0;j<i;j++){ a=(a+b*k[j])%m[i]; b=(b*m[j])%m[i]; } k[i]=(r[i]-a+m[i])*inv(b,m[i])%m[i]; } ll a=0,b=1; for(int i=0;i<n;i++){ a=(a+b*k[i])%M; b=(b*m[i])%M; } return (a+M)%M; } ///////////////////////// int N,S; int A[100]; ll temp[100010]; void solve(int P,int c,ll*dp){ ll g=calc_primitiveroot(P); ll z=modpow(g,P/c,P); ll zeta=1; for(int zeta_i=0;zeta_i<c;zeta_i++,zeta=zeta*z%P){ for(int i=0;i<=S;i++)temp[i]=0; temp[0]=1; int sum=0; for(int i=0;i<N;i++){ for(int j=sum;j>=0;j--)temp[j+A[i]]=(temp[j+A[i]]+temp[j]*zeta)%P; sum+=A[i]; } for(int i=0;i<=S;i++)dp[i]+=temp[i]; } int invc=inv(c,P); for(int i=0;i<=S;i++)dp[i]=dp[i]%P*invc%P; dp[0]=0; } ll ans[NUM][100010]; int main(){ int mod,C; scanf("%d%d%d",&N,&mod,&C); for(int i=0;i<N;i++)scanf("%d",&A[i]); for(int i=0;i<N;i++)S+=A[i]; int CC=2*C>=N?C:N-C; int P=1000000000/CC*CC+1; ll Ps[NUM]; for(int i=0;i<NUM;i++,P+=CC){ while(!isprime(P))P+=CC; solve(P,CC,ans[i]); Ps[i]=P; } ll r[NUM]; for(int i=1;i<=S;i++){ for(int j=0;j<NUM;j++)r[j]=ans[j][2*C>=N?i:S-i]; int ret=garner(r,Ps,mod); if(i==S&&2*C==N)ret=(ret-1+mod)%mod; printf("%d%c",ret,i==S?10:32); } }