codeforces 624d 623b Array GCD ★ ★

转载 2016年08月29日 14:59:44

题意:有两种操作,每种只能用一次,第一种对于一段连续区间进行移除(不能全删完),代价是长度*a,第二种是对于一些数进行+1或者-1,使得最后的剩余的最大公约数大于1

思路:由于不能全删完,所以至少会有一个数留着,这个数肯定会是头一个或最后一个,最大公约数肯定是在选中的这个数最后状态中的一个约数,而我们只要先枚举这个数是多少(一共6种),然后枚举他的素因子,用dp顺推即可。

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF  0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 1000100
#define MOD 1000000007

long long dp[maxn][3];
int val[maxn];
long long a,b;
int prime[maxn];
int vis[maxn];
int n,cnt,fac[maxn];

void init()
{
    cnt = 0;
    for(int i = 2; i < maxn; i++)
    {
        if(!vis[i])
            prime[cnt++] = i;
        for(int j = 0; j < cnt && prime[j]*i < maxn; j++)
        {
            vis[prime[j]*i] = 1;
            if(i%prime[j] == 0)
                break;
        }
    }
}
long long solve(int st,int ed,int v)
{
    memset(dp,0x3f3f3f3f3f3f3f3f,sizeof(dp));
    dp[st-1][0] = 0;
    for(int i = st; i <= ed; i++)
    {
        dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + a;
        if(val[i] % v != 0)
        {
            if((val[i]+1)%v == 0 || (val[i]-1)%v==0)
            {
                dp[i][0] = dp[i-1][0] + b;
                dp[i][2] = min(dp[i-1][1],dp[i-1][2]) + b;
            }
        }
        else
        {
            dp[i][0] = dp[i-1][0];
            dp[i][2] = min(dp[i-1][1],dp[i-1][2]);
        }
    }
    return min(min(dp[ed][0],dp[ed][1]),dp[ed][2]);
}
int factor(int x)
{
    int tot = 0;
    for(int j = 0; j < cnt && x >= prime[j]; j++)
    {
        if(x%prime[j] == 0)
        {
            fac[tot++] = prime[j];
            while(x%prime[j] == 0)
                x /= prime[j];
        }
    }
    if(x != 1)
        fac[tot++] = x;
    return tot;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int t,C = 1;
    //scanf("%d",&t);
    init();
    while(scanf("%d%lld%lld",&n,&a,&b) != EOF)
    {
        for(int i = 1; i <= n; i++)
            scanf("%d",&val[i]);
        long long ans = a * (long long)n;
        for(int i = -1; i <= 1; i++)
        {
            long long cost = i == 0?0:b;
            int len = factor(val[n]+i);
            for(int j = 0; j < len; j++)
                ans = min(ans,solve(1,n-1,fac[j])+cost);

            len = factor(val[1]+i);
            for(int j = 0; j < len; j++)
                ans = min(ans,solve(2,n,fac[j])+cost);
        }
        printf("%lld\n",ans);
    }
    return 0;
}


Codeforces 624D Array Gcd(数论+dp)

点击打开链接 //因为DEL只能操作一次&&不能删除所有元素 // a1 an 至少有一个存在->最后的gcd肯定为a1或者an的某个因子 //只要求gcd>1所以贪心:扫素因子即可(素因子已经...
  • Jeremy1149
  • Jeremy1149
  • 2016年10月24日 17:59
  • 172

codeforces 624d 623b Array GCD

过年玩了20天  都不会写了 题意:有两种操作,每种只能用一次,第一种对于一段连续区间进行移除(不能全删完),代价是长度*a,第二种是对于一些数进行+1或者-1,使得最后的剩余的最大公约数大...
  • u011528035
  • u011528035
  • 2016年02月19日 17:04
  • 362

Codeforces 623B:Array GCD

B. Array GCD time limit per test 3 seconds memory limit per test 256 megabytes inpu...
  • u010885899
  • u010885899
  • 2016年02月23日 19:49
  • 830

CodeForces 624D Array GCD

传送门:http://codeforces.com/problemset/problem/624/D 题目大意:给一个序列,有两种操作 1,删掉某一个连续区间,代价为区间长度*a 2,把...
  • LsFlyt
  • LsFlyt
  • 2016年02月21日 20:34
  • 298

CodeForces 623B Array GCD

CodeForces 623B Array GCD数论 dp 传送门:HustOJ 传送门:CodeForce 题意给你个数组,允许进行两种操作各最多一次。 第一种操作,删除某一区间内...
  • xzxxzx401
  • xzxxzx401
  • 2017年02月18日 16:30
  • 202

【dp】CodeForces - 623B Array GCD

Link:http://codeforces.com/problemset/problem/623/B #include #include #include #include #include #i...
  • qq_33199236
  • qq_33199236
  • 2017年07月27日 09:15
  • 107

Codeforces 623B Array GCD(枚举情况+dp)

给你一个数列,你能删除其中的连续的一段,花费是删除的数字个数∗a给你一个数列,你能删除其中的连续的一段,花费是删除的数字个数*a 你也可以把某些数字+1或者−1,对于每个数字只能做一次,花费是b你也...
  • Miracle_ma
  • Miracle_ma
  • 2016年09月13日 21:17
  • 226

CodeForces - 582A GCD Table (map大数操作&gcd)好题

CodeForces - 582A GCD Table Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO For...
  • yanghui07216
  • yanghui07216
  • 2016年04月30日 16:42
  • 614

hdu 4947 GCD Array 莫比乌斯反演

GCD Array Time Limit: 11000/5500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot...
  • NExPlain
  • NExPlain
  • 2014年08月14日 21:53
  • 1920

Codeforces 803F Coprime Subsequences DP+GCD

点击打开链接 题意:n个数a[i],问有多少个子序列的gcd为1? (子序列下标不同就算不同) n,a[i] 令dp[i]:gcd为i的子序列个数  i的倍数的子序列有2^c[i]-1个,这些子...
  • Jeremy1149
  • Jeremy1149
  • 2017年05月16日 18:05
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces 624d 623b Array GCD ★ ★
举报原因:
原因补充:

(最多只允许输入30个字)