結果
問題 | No.444 旨味の相乗効果 |
ユーザー |
![]() |
提出日時 | 2024-12-23 11:42:09 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 4 ms / 2,500 ms |
コード長 | 1,399 bytes |
コンパイル時間 | 3,315 ms |
コンパイル使用メモリ | 253,416 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-23 11:42:14 |
合計ジャッジ時間 | 4,374 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 23 |
ソースコード
#include<bits/stdc++.h>#define mod 1000000007using namespace std;int powdv(int x,long long y=mod-2){int ans=1;while(y){if(y&1)ans=1ll*ans*x%mod;y>>=1,x=1ll*x*x%mod;}return ans;}int a[105];int f[205];#define poly vector<int>void output(poly a){printf("### %d\n",(signed)a.size());for(auto cu:a)printf("%d ",cu);printf("\n");}poly multi(poly a,poly b){int n=a.size(),m=b.size();poly c(n+m-1);for(int i=0;i<n;++i)for(int j=0;j<m;++j){c[i+j]=(c[i+j]+1ll*a[i]*b[j])%mod;}return c;}poly zuo(poly a){int n=a.size();poly c(n+1);for(int i=0;i<n;++i)c[i+1]=a[i];return c;}poly qmo(poly a,poly b){int n=a.size(),m=b.size();if(n<m)return a;for(int i=n-1;i>=m-1;--i)for(int j=1;j<m;++j)a[i-j]=(a[i-j]-1ll*a[i]*b[m-1-j]%mod+mod)%mod;a.resize(m-1);return a;}poly qmod(long long n,poly p){if(n==0)return {1};poly q=qmod(n/2,p);poly qq=multi(q,q);if(n%2)qq=zuo(qq);return qmo(qq,p);}int main(){int n;long long c;scanf("%d%lld",&n,&c);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}f[0]=1;for(int i=1;i<=n;++i){for(int j=1;j<=n;++j)f[j]=(f[j]+1ll*f[j-1]*a[i])%mod;}poly p={1};for(int i=1;i<=n;++i)p=multi(p,{mod-a[i],1});poly an=qmod(c,p);an.resize(n);int ans=0;for(int i=0;i<n;++i)ans=(ans+1ll*f[i]*an[i])%mod;for(int i=1;i<=n;++i){ans=(ans-powdv(a[i],c)+mod)%mod;}printf("%d\n",ans);return 0;}