传送门

唉我觉得这题数据范围1e5都能做啊。。。

居然只出了2000

考完听zxyzxyzxy说我的贪心可以卡但过了?

可能今天本来是0+10+00+10+00+10+0只是运气好T1T1T1骗了100pts100pts100pts吧233.

下面讲讲贪心:

令wi=∏i=1kpiaiw_i=\prod_{i=1}^kp_i^{a_i}wi​=∏i=1k​piai​​

令A=∑aipi是好质数,B=∑ai,pi是坏质数A=\sum_{a_i} p_i是好质数,B=\sum_{a_i},p_i是坏质数A=∑ai​​pi​是好质数,B=∑ai​​,pi​是坏质数

那么fi=A−Bf_i=A-Bfi​=A−B

令gi=gcd(w1,w2,...,wi)g_i=gcd(w_1,w_2,...,w_i)gi​=gcd(w1​,w2​,...,wi​)

考虑j&lt;ij&lt;ij<i

有gi∣gjg_i|g_jgi​∣gj​

令k=gjgik=\frac {g_j} {g_i}k=gi​gj​​

那么有fgj=fk+fgif_{g_j}=f_k+f_{g_i}fgj​​=fk​+fgi​​

所以如果先在iii那个地方进行一次操作,无论怎么样都不会令结果变小。

于是我们从后向前算出所有有正的贡献的iii加到答案里面就行了。

代码:

#include<bits/stdc++.h>
#include<tr1/unordered_map>
using namespace std;
const int N=32005;
int n,m,pri[N],a[5005],b[5005],tot=0,sum=0,ans=0;
bool vis[N];
tr1::unordered_map<int,int>S;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
inline void init(){
	for(int i=2;i<=N-5;++i){
		if(!vis[i])pri[++tot]=i;
		for(int j=1;j<=tot&&i*pri[j]<=N-5;++j){
			int k=i*pri[j];
			vis[k]=1;
			if(i%pri[j]==0)break;
		}
	}
}
inline int calc(int x){
	int ret=0;
	for(int i=1;i<=tot&&pri[i]*pri[i]<=x;++i){
		if(x==1)break;
		if(x!=x/pri[i]*pri[i])continue;
		int cnt=0;
		while(x==x/pri[i]*pri[i])++cnt,x/=pri[i];
		if(S[pri[i]])ret-=cnt;
		else ret+=cnt;
	}
	if(x^1){
		if(S[x])--ret;
		else ++ret;
	}
	return ret;
}
int main(){
	init();
	n=read(),m=read(),S.clear();
	for(int i=1;i<=n;++i)a[i]=read();
	for(int i=1;i<=m;++i)S[read()]=1;
	for(int i=1;i<=n;++i){
		sum+=calc(a[i]);
		if(i^1)a[i]=__gcd(a[i],a[i-1]);
		b[i]=-calc(a[i]);
	}
	int pos=n,delta=0;
	while(pos){
		if(b[pos]-delta>0)sum+=(b[pos]-delta)*pos,delta+=b[pos]-delta;
		--pos;
	}
	cout<<sum;
	return 0;
}

2018.10.27 codeforces402D. Upgrading Array(数论+贪心)的更多相关文章

  1. 2018.10.27 loj#6035. 「雅礼集训 2017 Day4」洗衣服(贪心+堆)

    传送门 显然的贪心题啊...考试没调出来10pts滚了妙的一啊 直接分别用堆贪心出洗完第iii件衣服需要的最少时间和晾完第iii件衣服需要的最少时间. 我们设第一个算出来的数组是aaa,第二个是bbb ...

  2. 2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)

    传送门 唉蒟蒻又退化了,这道sb题居然做了20min,最后发现是updcovupdcovupdcov写成了updaddupdaddupdadd我还能说什么233233233 就是让你转边权为点权之后, ...

  3. Codeforces 402D Upgrading Array:贪心 + 数学

    题目链接:http://codeforces.com/problemset/problem/402/D 题意: 给你一个长度为n的数列a[i],又给出了m个“坏质数”b[i]. 定义函数f(s),其中 ...

  4. 2018.10.27 bzoj3209: 花神的数论题(数位dp)

    传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...

  5. 2018.10.27 洛谷P2915奶牛混合起来Mixed Up Cows(状压dp)

    传送门 状压dp入门题. 按照题意建一个图. 要求的就是合法的链的总数. 直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数. 然后从没被选并且跟iii ...

  6. 2018.10.27 loj#2292. 「THUSC 2016」成绩单(区间dp)

    传送门 g[i][j][k][l]g[i][j][k][l]g[i][j][k][l]表示将区间l,rl,rl,r变成最小值等于kkk,最大值等于lll时的花费的最优值. f[i][j]f[i][j] ...

  7. 2018.10.26 poj3421X-factor Chains(数论+排列组合)

    传送门 排列组合入门题. 令X=p1a1p2a2..pkakX=p_1^{a_1}p_2^{a_2}..p_k^{a_k}X=p1a1​​p2a2​​..pkak​​ 那么答案1就等于∑i=1kai\ ...

  8. 2018.10.21 codeforces1071A. Cram Time(贪心构造)

    传送门 直接先看最多能够凑出几个. 然后可以得到一个结论就是如果保证所有页数之和是小于等于A+BA+BA+B的一定都对应着一种合法方案. 如何构造? 我们对于第一天的AAA个小时,从大向小选,如果当前 ...

  9. POI 2018.10.27

    [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进 ...

随机推荐

  1. Cisco无线AP上联口为trunk时无法注册故障处理

    网络环境:WLC5520  AP:1832i-h-k9 客户实施过程中电话告知其将AP和交换机互联的端口类型设置为TRUNK口后,AP无法注册到WLC上,后经过查看配置发现客户用于AP管理的VLAN为 ...

  2. mysql5.5以上my.ini中设置字符集

    在mysql5.1之前数据库设置字符集: [mysqld] default-character-set = utf8 mysql5.5以后[mysqld]中就不能使用default-character ...

  3. stark组件开发之URL别名的设置

    from django.urls import re_path from stark.servers.start_v1 import site, StartHandler from django.ht ...

  4. c# 软件绑定网卡mac的实用

    一:网上搜c# 绑定网卡Mac 有好多信息,其中有篇分为几种方法获取mac 的方法,结果获得到的是一个list 队列的信息,信息获取到所有的物理网卡,无线网卡,蓝牙,隧道的网卡物理地址.对与软件绑定物 ...

  5. Oracle_PL/SQL(7) 集合

    pl/sql集合处理单行单列数据,可以使用标量变量:处理单行多列的数据,可以使用pl/sql记录(%rowtype,record):处理单列多行数据,可以使用pl/sql集合. pl/sql集合类型是 ...

  6. 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...

  7. Python 环境安装教程(Windows 10)

    Python编程语言非常强大,非常容易上手,版本更新也不慢,在win10 x64中兼容性也很好,直接安装不需另外配置,虽然Python2和3有点异同.学习的话选择最新的 python 3.7.1版. ...

  8. Java界面编程—事件监听机制

    组件首先要先注册事件处理器,当用户单击组件.移动鼠标或者敲击键盘时都会产生事件(Event),一旦有时间发生,应用程序就会做出对该事件的响应,这些组件就是事件源(Event source). 接受.解 ...

  9. [Jmeter] Run Command to generate a specific listener’s chart report

    Run Command to generate a specific listener’s chart report: Download cmdrunner-2.0.jar : https://jme ...

  10. Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器

    一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...