結果
問題 | No.603 hel__world (2) |
ユーザー |
![]() |
提出日時 | 2017-12-03 15:06:59 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 629 ms / 3,000 ms |
コード長 | 2,631 bytes |
コンパイル時間 | 1,931 ms |
コンパイル使用メモリ | 174,620 KB |
実行使用メモリ | 50,052 KB |
最終ジャッジ日時 | 2024-11-30 20:54:33 |
合計ジャッジ時間 | 12,763 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
コンパイルメッセージ
main.cpp:42:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 42 | main(){ | ^~~~
ソースコード
#include <bits/stdc++.h>using namespace std;#define MD 1000003long long S[26];char T[1000010];int xlen[1000010];long long xnnn[1000010];int inv[1000010];int fac[1000010];int get_inv(long long a, int md){long long e, s=md, t=a, u=1, v=0;while(s){e=t/s;t-=e*s;u-=e*v;swap(t,s);swap(u,v);}if(u<0){u+=md;}return u;}void mkinv(){for(int i=1;i<MD;++i){inv[i]=get_inv(i,MD);}}void mkfac(){fac[0]=1;for(int i=1;i<MD;++i){fac[i]=(long long)fac[i-1]*i%MD;}}main(){mkinv();mkfac();for(int c=0;c<26;++c){cin>>S[c];}cin>>T;int tlen=strlen(T);int r=1;int mc=0;for(int c=0;c<26;++c){priority_queue<pair<long double,int>> pq;int n=0;int st=-1;int xsum=0;for(int i=0;i<=tlen;++i){if(T[i]==c+'a'){if(st<0){st=i;}}else{if(st>=0){int xl=i-st;xlen[n]=xl;//pq.push(make_pair(1.*(xl+1),n));++n;//if((S[c]-=xl)<0){xsum+=xl;if(xsum>S[c]){cout<<0;exit(0);}st=-1;}}}if(xsum) {#if 1long long xdiv = S[c]/xsum;S[c]%=xsum;for(int j=0;j<n;++j){xnnn[j]=xlen[j]*xdiv;r=(long long)r*fac[xnnn[j]%MD]%MD;r=(long long)r*fac[xnnn[j]/MD%MD]%MD;r=(long long)r*fac[xnnn[j]/MD/MD%MD]%MD;if(xnnn[j]/MD%2) r=(MD-r)%MD;if(xnnn[j]/MD/MD%2) r=(MD-r)%MD;mc+=xnnn[j]/MD;mc+=xnnn[j]/MD/MD;r=(long long)r*inv[fac[(xnnn[j]-xlen[j])%MD]]%MD;r=(long long)r*inv[fac[(xnnn[j]-xlen[j])/MD%MD]]%MD;r=(long long)r*inv[fac[(xnnn[j]-xlen[j])/MD/MD%MD]]%MD;if((xnnn[j]-xlen[j])/MD%2) r=(MD-r)%MD;if((xnnn[j]-xlen[j])/MD/MD%2) r=(MD-r)%MD;mc-=(xnnn[j]-xlen[j])/MD;mc-=(xnnn[j]-xlen[j])/MD/MD;r=(long long)r*inv[fac[xlen[j]]]%MD;//pq.push(make_pair((long double)(xnnn[j]+1)/(xnnn[j]+1-xlen[j]),j));pq.push(make_pair((long double)(xlen[j])/(xnnn[j]+1-xlen[j]),j));}#elseS[c]-=xsum;for(int j=0;j<n;++j){xnnn[j]=xlen[j];//pq.push(make_pair((long double)(xnnn[j]+1)/(xnnn[j]+1-xlen[j]),j));pq.push(make_pair((long double)(xlen[j])/(xnnn[j]+1-xlen[j]),j));}#endifwhile(S[c]--){auto p=pq.top();pq.pop();int j=p.second;++xnnn[j];long long t=xnnn[j];while(t%MD==0){t/=MD;++mc;}r=(long long)r*(t%MD)%MD;t=xnnn[j]-xlen[j];while(t%MD==0){t/=MD;--mc;}r=(long long)r*inv[t%MD]%MD;//pq.push(make_pair((long double)(xnnn[j]+1)/(xnnn[j]+1-xlen[j]),j));pq.push(make_pair((long double)(xlen[j])/(xnnn[j]+1-xlen[j]),j));}if(mc){cout<<0;exit(0);}}}cout<<r;}