【链接】h在这里写链接


【题意】


定义bad list是一个非空的、最大公约数为1的序列。给定一个序列,有两种操作:花费x将一个元素删除、花费y将一个元素加1,问你将这个序列变为good list所需要的最小花费是多少。

【题解】


枚举gcd为i.
这里的枚举,并不是说确切这些数字的gcd就是i;
而是枚举这些数的gcd是i的倍数。
这样的话,每个数字都必须是i的倍数。
(然后,我们只要贪心地让每个数都变成i的倍数就好了,最近的i的倍数,这样肯定是最优的)
(最后gcd到底是多少,并不重要,只要肯定它是i的倍数就好,i>=2);
(最后的gcd为多少,其实取决于我们的贪心结果,它是一个i的倍数,且是在满足花费最小的情况下一个i的倍数)
(那么,虽然你i的倍数还有其他,也能组成i的倍数的gcd,但是我们不要那些数字了,因为那些数字肯定没有这个gcd来得优,因为你的花费肯定没有我这样贪心选的花费来得低.
这里枚举i只要枚举1..10^6里面的素数就好。
因为不管你的gcd是多少,它肯定是某个素数的倍数
然后,我们只要对0..i,i+1..2i,2i+1..3i....这些范围里面的数字,优先选一个离它最近的i的倍数,加成它就好了.
又或者,你觉得加上去不划算->直接删掉更好。那么就不加。
可以肯定.
对于L = t*i,R = (t+1)*i
L..R-(x/y)-1肯定是删掉更优.
R-(x/y)..R肯定是一个一个加到R更优
每一个L..R都能用前缀和O(1)算出来最小花费.
(sum[i]表示a[]中小于等于i的数和,num[i]表示a[]中小于等于i的数的个数)
其中一个一个加到R的情况比较麻烦。
要这么写
->R*(num[R-1]-num[R-x/y-1]) -
sum[R-1]-sum[R-x/y-1]
;
这个减号左边这个范围的数全部加成R之后的和.
减号右边是这个范围里的数原来的全部和.
差值,就是这个范围里面的数全都加成R需要的操作数了。
把这个乘上y就是花费了
所有i的花费最小值就好
前缀和要处理到2e6.
因为可能会出现gcd比如为99 99999的倍数的情况
比如a[1] = 99 99999 a[2] = 100 0000
然后删掉一个数花费为1  数字加上1的花费为y(y>1)
这样的话,我们会处理【99 99999 +1 .. 99 99999 *2】这个区间了。
(然后把a[2]删掉)
处理这区间肯定要用到大于1e6的前缀和了。

【错的次数】


0

【反思】


枚举gcd的质因子i,注意到每个数必然都是i的倍数。
然后一个区间一个区间地处理。
区间里面有一些东西能用前缀和处理出来。
快速得到答案。
不用拘泥于gcd具体是什么。

【代码】

/*
    所有数字都等于1
        ①把n-1个数字删掉,剩下一个数字,再递增1? (n-1)*x + y = n*x + y - x
        ②或者,把n个数字都加上1,花费为n*y
        n*x + y - x > n*y
        n*x - n*y > x - y;
        n*(x-y) > (x-y)
        如果x > y
            选第二种
        如果x < y
            选第一种
        但是,也可以其中一些数字加上1,剩下的全删掉.
        一个数字加上1之后,就不用删掉了.
        所以,哪一个花费比较低,就优先操作那一个就好.
        那最后如果全是选删掉怎么办?
        那就只能留一个选增加了。
    枚举最后的gcd为i.
    然后如果一个数字比它小的话,就看一下加的费用和删的费用,哪一个比较大。
        选那个费用比较小的。
        然后选取费用差值最小的那个,以防全都被删掉了。
    O(N^2)的复杂度了
        比i小的数字,肯定是要删掉的->不一定,可以加到gcd.
            但加到一定程度,就一定要删掉的。
            因为删掉的花费不变,但是你一直增加,花费是会变多的。
    但是也不一定能被i整除,整体的gcd就是i啊
    give up. */ #include <bits/stdc++.h>
using namespace std; const int N = 2e6; int n;
long long num[N+10], sum[N+10],x,y,ans = -1; void inandpre() {
    cin >> n >> x >> y;
    
    for (int i = 1; i <= n; i++) {
        int t;
        cin >> t;
        num[t]++, sum[t] += t;
    }     for (int i = 1; i <= N; i++)
        sum[i] += sum[i - 1],num[i]+=num[i-1];
} const int M = 1e6;
bool iszs[M + 10];
vector <int> zsb;
void getzhishu() {
    memset(iszs, true,sizeof iszs);
    for (int i = 2; i <= M; i++){
        if (iszs[i]) zsb.push_back(i);
        int len = zsb.size();
        for (int j = 0; j <= len - 1; j++) {
            int t = zsb[j];
            if (i*t > M) break;
            iszs[i*t] = false;
            if (i%t == 0) break;
        }
    }
} void meiju() {
    for (int ii = 0; ii <= (int) zsb.size()-1; ii++) {
        long long rest = 0;
        int i = zsb[ii];
        for (int j = i; j <= N; j += i) {
            long long temp = x / y;
            long long ju = j - temp,l = j-i+1,r = j;
            ju = max(ju, l);
            rest += x*(num[ju-1] - num[l - 1]);//删掉
            rest += y*((num[r - 1] - num[ju - 1])*r - (sum[r-1]-sum[ju-1]));//加上
        }
        if (ans == -1)
            ans = rest;
        else
            ans = min(ans, rest);
    }
} void out() {
    cout << ans << endl;
} int main() {
    //freopen("F:\\rush.txt", "r", stdin);
    ios::sync_with_stdio(0);
    inandpre();
    getzhishu();
    meiju();
    out();
    return 0;
}

【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers的更多相关文章

  1. 【Codeforces Round #432 (Div. 2) A】 Arpa and a research in Mexican wave

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] t<=k,输出t t>=n,输出k-t+n 其他情况都是k [错的次数] 0 [反思] 在这了写反思 [代码] /* */ #in ...

  2. 【Codeforces Round #432 (Div. 2) B】Arpa and an exam about geometry

    [链接]h在这里写链接 [题意] 给你3个点A,B,C 问你能不能将纸绕着坐标轴上的一点旋转.使得A与B重合,B与C重合 [题解] 这3个点必须共圆. 则A,B,C不能为一条直线.否则无解. 共圆之后 ...

  3. 【Codeforces Round #432 (Div. 1) A】 Five Dimensional Points

    [链接]点击打开链接 [题意] 给你n个5维的点. 然后让你以其中的某一个点作为起点a. 另选两个点b,c. 组成向量a->b,a->c 如果所有的a->b和a->c的夹角都是 ...

  4. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  5. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  6. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  7. 【Codeforces Round #423 (Div. 2) C】String Reconstruction

    [Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...

  8. 【Codeforces Round #423 (Div. 2) B】Black Square

    [Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...

  9. 【Codeforces Round #423 (Div. 2) A】Restaurant Tables

    [Link]:http://codeforces.com/contest/828/problem/A [Description] 有n个组按照时间顺序来餐馆; 每个组由一个人或两个人组成; 每当有一个 ...

随机推荐

  1. AutoLayout具体解释+手把手实战

    首先说一下这篇博客尽管是标记为原创,可是事实并不是本人亲自写出来的.知识点和样例本人花了一天各处查找和整理终于决定写一个汇总的具体解释,解去各位朋友到处盲目查找的必要,由于不是转载某一个人的内容.故此 ...

  2. Node.js转化GBK编码 - iconv-lite

    node当使用node获取GBK编码的数据时,nodejs仅仅支持utf-8,node没有提供转换编码的原生支持,有倒是有一个模块iconv能干这个事,但须要本地方法,VC++库的支持.国外有个大牛写 ...

  3. android framework 02

    Android底层开发1.安装Ubuntu系统2.Ubuntu配置开发环境: sudo apt-get install git-core gnupg flex bison gperf zip sudo ...

  4. [BZOJ3526][Poi2014]Card 线段树

    链接 题意:有一些卡牌,正反各有一个数,你可以任意翻转,每次操作会将两张卡牌的位置调换,你需要在每次操作后回答以现在的卡牌顺序能否通过反转形成一个单调不降的序列 题解 线段树上维护 \(f[o][0/ ...

  5. 13.Axis创建webservice客户端和服务端

    转自:https://blog.csdn.net/chenghui0317/article/details/9318317 一.Axis的介绍 Web Service是现在最适合实现SOA的技术,而A ...

  6. POJ 3174 暴力枚举

    思路: 暴力枚举三个点 判一判 搞定 (x1*y1=x2*y2) x1.y1.x2.y2为他们两两的差 //By SiriusRen #include <cstdio> using nam ...

  7. java knowledge record

    javax.accessibility.Accessible       给予private  或者 final 变量可以改变的机会

  8. Centos7.0 Vmware10.0.3 网络桥接配置

    首先要将Vmware10.0.3设置为桥接模式. CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd  /etc/sysconfig/network-scripts/  #进入网络配置 ...

  9. Ubuntu 16.04下的LAMP环境配置

    在学习开发过程中,每当遇到新的问题时,通常都能在网上搜到解决的方法,但是网上的方法千千万,有些是已经过时了的,有些是跟自己开发环境不同的,总是不能第一时间能找到答案. 而当时遇到的问题可能在今后的开发 ...

  10. 洛谷 P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...