結果
問題 | No.1334 Multiply or Add |
ユーザー |
![]() |
提出日時 | 2020-11-08 16:46:51 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 209 ms / 2,000 ms |
コード長 | 1,868 bytes |
コンパイル時間 | 1,068 ms |
コンパイル使用メモリ | 78,416 KB |
最終ジャッジ日時 | 2025-01-15 21:40:01 |
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 71 |
ソースコード
#include<algorithm>#include<cassert>#include<iostream>#include<vector>using namespace std;typedef long long lint;typedef vector<int>vi;typedef vector<lint>vl;typedef pair<int,int>pii;#define rep(i,n)for(int i=0;i<(int)(n);++i)const lint mod=1e9+7;lint cmul(lint a,lint b){a=min(a,mod);b=min(b,mod);return min(a*b,mod);}int n;vl a;vl o,num,numcap;const lint lim=1e6,blim=20;bool dp[blim+1][lim];//ACint main(){cin>>n;a.resize(n);rep(i,n)cin>>a[i];lint sum=0;int c1=0;lint pr=1,cap=1;int ph=0;rep(i,n){if(a[i]==1){if(ph==0){c1++;}else{o.push_back(c1);num.push_back(pr);numcap.push_back(cap);ph=0;pr=1;cap=1;c1=1;}}else{if(ph==0){ph=1;}pr=pr*a[i]%mod;cap=cmul(cap,a[i]);}}if(ph==0){sum=c1;}else{o.push_back(c1);num.push_back(pr);numcap.push_back(cap);}cerr<<sum<<endl;rep(i,o.size()){cerr<<" "<<o[i]<<" "<<num[i]<<" ("<<numcap[i]<<")"<<endl;}lint gpr=1;lint gcap=1;rep(i,o.size()){gpr=gpr*num[i]%mod;gcap=cmul(gcap,numcap[i]);}//ここで積が 2n 以上であれば、掛け算が最適。//1 の個数を x とすると a+x+b>ab であることが必要だが、これはx>=(a-1)*(b-1) と同値で、//ab>=2n であれば (a-1)*(b-1)>=n-1 である。if(gcap>=lim/2){sum+=o[0];cout<<(sum+gpr)%mod<<endl;return 0;}assert(o.size()<=blim);dp[0][0]=1;for(int i=1;i<=(int)o.size();i++){rep(j,i){lint locpr=1;for(int k=j;k<i;k++)locpr*=num[k];rep(k,lim){if(!dp[j][k])continue;assert(k+locpr+o[j]<lim);dp[i][k+locpr+o[j]]=1;}}}int ma=0;rep(i,lim)if(dp[o.size()][i])ma=i;cout<<ma+sum<<endl;}