CF402D Upgrading Array
原题链接
先用素数筛筛下素数,然后考虑贪心去操作。
先求前缀\(GCD\)(求到\(GCD\)为\(1\)就不用再往下求了),得到数组\(G[i]\),然后从后往前扫,如果\(f(G[i]) < 0\),那么我们贪心地把\(i\)及之前的数全部除以\(G[i]\),当然前缀\(GCD\)数组同时也要除掉,然后重复上述操作,直到不能除为止。
计算\(f\)可以递归分解求解。
#include<cstdio>
using namespace std;
const int N = 5010;
const int M = 1e6;
int a[N], b[N], pr[M], G[N], l, m;
bool v[M + 10];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
int gcd(int x, int y)
{
if (!y)
return x;
return gcd(y, x % y);
}
bool fin(int x)
{
int l = 1, r = m, mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (!(b[mid] ^ x))
return true;
b[mid] > x ? r = mid - 1 : l = mid + 1;
}
return false;
}
int js(int x)
{
if (!(x ^ 1))
return 0;
for (int i = 1; i <= l; i++)
{
if (pr[i] * pr[i] > x)
return fin(x) ? -1 : 1;
if (!(x % pr[i]))
return js(x / pr[i]) + (fin(pr[i]) ? -1 : 1);
}
}
int main()
{
int i, j, n, la;
long long s = 0;
n = re();
m = re();
for (i = 1; i <= n; i++)
a[i] = re();
for (i = 1; i <= m; i++)
b[i] = re();
v[0] = v[1] = 1;
for (i = 2; i <= M; i++)
{
if (!v[i])
pr[++l] = i;
for (j = 1; j <= l; j++)
{
if (i * pr[j] > M)
break;
v[i * pr[j]] = 1;
if (!(i % pr[j]))
break;
}
}
G[1] = a[1];
for (i = 2; i <= n; i++)
{
G[i] = gcd(G[i - 1], a[i]);
if (!(G[i] ^ 1))
break;
}
la = i - 1;
while(la > 0)
{
for (; js(G[la]) >= 0 && la > 0; la--);
if (la > 0)
for (i = 1; i <= la; i++)
{
a[i] /= G[la];
G[i] /= G[la];
}
}
for (i = 1; i <= n; i++)
s += js(a[i]);
printf("%lld", s);
return 0;
}
CF402D Upgrading Array的更多相关文章
- CF402D 【Upgrading Array】
题目链接: CF402D 题目分析: 首先考虑一下怎么求每个数的分数.把每个数分解到最后会发现它的坏质因子对它分数的贡献是\(-1\),好质因子对它分数的贡献是\(1\),那么最后的分数就是好质因数- ...
- CF_402D Upgrading Array 因式分解
题目链接:http://codeforces.com/problemset/problem/402/D /**算法分析: */ #include<bits/stdc++.h> #defin ...
- codeforces Upgrading Array
思路:对于每个数分解质因子然后记录每一个质因子的个数,对与在b中出现的质因子就减去1,否则加1,求出总的,然后从后面一次对它们的最大公约数,然后判断除以最大公约数之后,改变量是不是变化,求最大值,变化 ...
- Codeforces 494D Upgrading Array
http://codeforces.com/contest/494/problem/D 题意:给一个数组,和一个坏质数集合,可以无数次地让1到i这些所有数字除以他们的gcd,然后要求Σf(a[i])的 ...
- 2018.10.27 codeforces402D. Upgrading Array(数论+贪心)
传送门 唉我觉得这题数据范围1e5都能做啊... 居然只出了2000 考完听zxyzxyzxy说我的贪心可以卡但过了? 可能今天本来是0+10+00+10+00+10+0只是运气好T1T1T1骗了10 ...
- CodeForces 402D Upgrading Array (数学+DP)
题意:给出一个数列,可以进行一种操作将某一个前缀除去他们的gcd,有一个函数f(x),f(1) = 0 , f(x) = f(x/p)+1,f(x) = f(x/p)-1(p是坏素数), 求 sum( ...
- Codeforces 402D Upgrading Array:贪心 + 数学
题目链接:http://codeforces.com/problemset/problem/402/D 题意: 给你一个长度为n的数列a[i],又给出了m个“坏质数”b[i]. 定义函数f(s),其中 ...
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
- codeforces 402 D. Upgrading Array(数论+贪心)
题目链接:http://codeforces.com/contest/402/problem/D 题意:给出一个a串和素数串b .f(1) = 0; p为s的最小素因子如果p不属于b , 否则 . a ...
随机推荐
- java 代码块,静态代码块,构造器等的执行顺序
写了一段测试代码,如下: public class ExecutionSequence extends fatherClass{ static{ System.out.printl ...
- scrapy 常用代码
一,scrapy请求 yield scrapy.Request(url=url, dont_filter=True, callback=self.page, meta={'item': item}) ...
- 学JS的心路历程 -数组常见处理方法
昨天我们有提到说for-of和forEach可以用来处理数组,但其实还有很多方法可以更快速及精简代码的达到你要的效果. 话不多说,我们赶紧来看吧! Array.prototype.map() 会回传一 ...
- oracle 中如何定位重要(消耗资源多)的SQL
链接:http://www.xifenfei.com/699.html 标题:oracle 中如何定位重要(消耗资源多)的SQL 作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则 ...
- Windows消息循环
首先理解一句话:“Windows”向应用程序发送了一条消息.这里是指Windows调用了该程序内部的一个函数. 当UpdateWindow被调用后,新建的窗口在屏幕便完全可见了.此时,Windows会 ...
- spket插件安装并设置JQuery自动提示(转)
spket是一个开发JavaScript.jQuery.Ext_js等的开发工具,它可以 是独立的IDE,也可以作为Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件: 1.首 ...
- 对象转化为json
google开发的Gson转换利器,String json = new Gson ().toJson(object); 一行代搞定. 别忘了引入jar包 转自:https://zhidao.baidu ...
- exe4j 安装
需要看清楚对应的jre版本 4.6---jre1.6 5.0以上---jre1.7
- leetcode 中等题(1)
2. Add Two Numbers(中等) /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis ...
- 搭建Java后台
jdk+eclipse+svn+maven+mysql+tomcat7.0+sublime安装包和jar插件 配置管理工具-SVN http://download.csdn.net/detail/u0 ...