国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

CodeForces 623B Array GCD

2019-11-08 02:50:03
字體:
供稿:網(wǎng)友

CodeForces 623B Array GCD

數(shù)論 dp

傳送門:HustOJ

傳送門:CodeForce


題意

給你個數(shù)組,允許進(jìn)行兩種操作各最多一次。 第一種操作,刪除某一區(qū)間內(nèi)所有數(shù)。注意不能刪全部的數(shù)。代價是個數(shù)*a。 第二種操作,對某些數(shù)進(jìn)行+1或-1。注意可以部分加1部分減1。代價是每個數(shù)b。 問你使剩下數(shù)公約數(shù)大于1所需花費(fèi)的最小代價。


思路

%%%

由于不能全刪完,所以至少會有一個數(shù)留著,這個數(shù)肯定會是頭一個或最后一個,最大公約數(shù)肯定是在選中的這個數(shù)最后狀態(tài)中的一個約數(shù),而我們只要先枚舉這個數(shù)是多少(一共6種),然后枚舉他的素因子,用dp順推即可。

{a1+1, a1a1?1, an+1, anan?1}一共6個數(shù),進(jìn)行質(zhì)因數(shù)分解6次,每次枚舉所有質(zhì)因子,遞推計算代價,最后加上處理 a1an的代價。

dp[MAXN][3];//第二位 0表示沒開始刪 1表示正在刪 2表示結(jié)束了刪

注意狀態(tài)轉(zhuǎn)移的方式。


代碼

#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <vector>#include <cmath>#include <queue>#include <stack>#define _ ios_base::sync_with_stdio(0);cin.tie(0);#define M(a,b) memset(a,b,sizeof(a));using namespace std;const int MAXN=1000005;const int oo=0x3f3f3f3f;typedef long long LL;const LL loo=4223372036854775807ll;typedef long double LB;int num[MAXN];bool isPRime[MAXN];vector<int> prime;vector<int> fact;void GetPrime(){ M(isprime, 0); for(int i=2; i<MAXN; i++) if(isprime[i]==0) { for(int j=2; i<MAXN/j; j++) isprime[i*j]=1; prime.push_back(i); }}void GetFactor(int x){ fact.clear(); for(int i=0;i<prime.size();i++) { if(x%prime[i]==0) fact.push_back(prime[i]); while(x%prime[i]==0) x/=prime[i]; if(x==1) break; } if(x!=1) fact.push_back(x);//注意最后剩的x要不是1,那一定是個大質(zhì)數(shù)}LL dp[MAXN][3];//第二位 0表示沒開始刪 1表示正在刪 2表示結(jié)束了刪LL cost1, cost2;LL deal(int s, int e, int fa){ M(dp, 0x3f);dp[s-1][0]=0; for(int i=s;i<=e;i++) { dp[i][1]=min(dp[i-1][0], dp[i-1][1])+cost1; if(num[i]%fa==0) { dp[i][0]=dp[i-1][0]; dp[i][2]=min(dp[i-1][2], dp[i-1][1]); } else if((num[i]+1)%fa==0||(num[i]-1)%fa==0) { dp[i][0]=dp[i-1][0]+cost2; dp[i][2]=min(dp[i-1][1], dp[i-1][2])+cost2; } } LL tt=min(dp[e][0], dp[e][1]); return min(tt, dp[e][2]);}int main(){ _ int n; GetPrime(); while(cin>>n) { cin>>cost1>>cost2; for(int i=1;i<=n;i++) cin>>num[i]; LL res=loo; for(int t=-1;t<2;t++) { GetFactor(num[1]+t); for(int i=0;i<fact.size();i++) res=min(res, deal(2, n, fact[i])+(t==0 ? 0 : cost2)); GetFactor(num[n]+t); for(int i=0;i<fact.size();i++) res=min(res, deal(1, n-1, fact[i])+(t==0 ? 0 : cost2)); } cout<<res<<endl; } return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 温州市| 广昌县| 邓州市| 石嘴山市| 海城市| 马龙县| 松阳县| 芮城县| 临澧县| 尉犁县| 耿马| 武隆县| 蒙自县| 石狮市| 古蔺县| 六盘水市| 高雄县| 卓尼县| 克什克腾旗| 巴中市| 泰宁县| 仲巴县| 永州市| 南乐县| 昌都县| 德江县| 阿图什市| 无棣县| 即墨市| 合水县| 卓资县| 平顺县| 邢台县| 上栗县| 邮箱| 渭南市| 司法| 宜州市| 新龙县| 石泉县| 桐庐县|