题目链接:http://codeforces.com/problemset/problem/402/D

  1. /**算法分析:
  2.  
  3. */
  4. #include<bits/stdc++.h>
  5. #define MAXN 5005
  6. #define MAXM 110000
  7. #define PI acos(-1.0)
  8. #define REP(i,n) for(int i=0; i<n; i++)
  9. #define FOR(i,s,t) for(int i=s; i<=t; i++)
  10. #define mem(a,b) memset(a,b,sizeof(a))
  11. #define show(x) { cerr<<">>>"<<#x<<" = "<<x<<endl; }
  12. #define showtwo(x,y) { cerr<<">>>"<<#x<<"="<<x<<" "<<#y<<" = "<<y<<endl; }
  13. using namespace std;
  14.  
  15. int prime[MAXM],prime_index;
  16. int a[MAXN],gcd[MAXN];
  17. int n,m;
  18. set<int> badset;
  19. map<int,int> vis;
  20.  
  21. void get_prime()
  22. {
  23. prime_index = ;
  24. bool flag[MAXM]; mem(flag,);
  25. FOR(i,,MAXM-)
  26. {
  27. if(!flag[i])
  28. {
  29. prime[prime_index++] = i;
  30. for(int j=i+i; j<MAXM; j+=i)
  31. flag[j] = true;
  32. }
  33. }
  34. }
  35.  
  36. int F(int s)
  37. {
  38. int ret = ,rcd = s; //这个rcd十分重要,注意改变的数如果还要操作就需要记录
  39. if(badset.count(s)) return -;
  40. if(vis.find(s) != vis.end()) return vis[s];
  41. //进行因式分解,一种预处理出质数,另一种直接sqrt(n);
  42. /**
  43. for(int i=0; i < prime_index && prime[i]*prime[i] <= s; i++)
  44. {
  45. int p = prime[i];
  46. if(s % p == 0)
  47. {
  48. int isbad;
  49. if(badset.count(p)) isbad = -1;
  50. else isbad = 1;
  51. while(s % p == 0) ret += isbad, s /= p;
  52. }
  53. }
  54. */
  55. for(int i=; i*i <= s; i++)
  56. {
  57. int p = i;
  58. if(s % p == )
  59. {
  60. int isbad;
  61. if(badset.count(p)) isbad = -;
  62. else isbad = ;
  63. while(s % p == ) ret += isbad, s /= p;
  64. }
  65. }
  66.  
  67. if(s != )
  68. {
  69. if(badset.count(s)) ret--;
  70. else ret++;
  71. }
  72. return vis[rcd] = ret;
  73. }
  74.  
  75. int main()
  76. {
  77. // freopen("E:\\acm\\input.txt","r",stdin);
  78. // get_prime();
  79. cin>>n>>m;
  80. FOR(i,,n) scanf("%d",&a[i]);
  81. FOR(i,,m)
  82. {
  83. int tmp; scanf("%d",&tmp);
  84. badset.insert(tmp);
  85. }
  86. int ans = ;
  87. gcd[] = a[];
  88. FOR(i,,n)
  89. {
  90. ans += F(a[i]);
  91. gcd[i] = __gcd(gcd[i-],a[i]);
  92. }
  93.  
  94. int decr = ;
  95. for(int i=n; i>=; i--)
  96. {
  97. int cur_f = F(gcd[i]) + decr;
  98. if(cur_f < )
  99. {
  100. ans -= cur_f * i;
  101. decr -= cur_f;
  102. }
  103. }
  104. cout<<ans<<endl;
  105. }

CF_402D Upgrading Array 因式分解的更多相关文章

  1. codeforces Upgrading Array

    思路:对于每个数分解质因子然后记录每一个质因子的个数,对与在b中出现的质因子就减去1,否则加1,求出总的,然后从后面一次对它们的最大公约数,然后判断除以最大公约数之后,改变量是不是变化,求最大值,变化 ...

  2. Codeforces 494D Upgrading Array

    http://codeforces.com/contest/494/problem/D 题意:给一个数组,和一个坏质数集合,可以无数次地让1到i这些所有数字除以他们的gcd,然后要求Σf(a[i])的 ...

  3. CF402D Upgrading Array

    原题链接 先用素数筛筛下素数,然后考虑贪心去操作. 先求前缀\(GCD\)(求到\(GCD\)为\(1\)就不用再往下求了),得到数组\(G[i]\),然后从后往前扫,如果\(f(G[i]) < ...

  4. 2018.10.27 codeforces402D. Upgrading Array(数论+贪心)

    传送门 唉我觉得这题数据范围1e5都能做啊... 居然只出了2000 考完听zxyzxyzxy说我的贪心可以卡但过了? 可能今天本来是0+10+00+10+00+10+0只是运气好T1T1T1骗了10 ...

  5. 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( ...

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

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

  7. 【Henu ACM Round#17 F】Upgrading Array

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...

  8. codeforces 402 D. Upgrading Array(数论+贪心)

    题目链接:http://codeforces.com/contest/402/problem/D 题意:给出一个a串和素数串b .f(1) = 0; p为s的最小素因子如果p不属于b , 否则 . a ...

  9. CF402D 【Upgrading Array】

    题目链接: CF402D 题目分析: 首先考虑一下怎么求每个数的分数.把每个数分解到最后会发现它的坏质因子对它分数的贡献是\(-1\),好质因子对它分数的贡献是\(1\),那么最后的分数就是好质因数- ...

随机推荐

  1. 数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间

    数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间 1.题目中要求我们不能使用额外的空间,那么我们能采用在原数组上做文章,这里的重点是如何 ...

  2. c++ 重定位输出到DOS

    #define USE_WIN32_CONSOLE int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTST ...

  3. sjtu1333 函数时代

    Description Taring说:生活的过程就是执行函数的过程.需要命令,也需要回报.更重要的,是得到回报的过程. 好吧...这道题其实和上面的也没啥关系TAT,我们要求的是下面的问题: 给定\ ...

  4. ASP.NET 使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer 模式。

    http://blog.csdn.net/fox123871/article/details/8165431 session是工作在你的应用程序进程中的.asp.net进程.iis往往会在20分钟之后 ...

  5. ZOJ 3170 Friends

    点我看题目 题意 : 就是有n个人,m对关系,每对关系的两个人是好朋友,这个关系是相互的,如果有两个人的共同好朋友超过k个,那这两个人也会是好朋友的,给你m对关系,给你足够长的时间,问你还能增加几对关 ...

  6. java客户端连接MongoDB数据库的简单使用

    1.下载mongoDB的jar包,并引入到工程的CLASSPATH中下载:mongodb2.5驱动包下载 如果使用maven项目,最新的依赖如下: <dependency> <gro ...

  7. UVA 658 It's not a Bug, it's a Feature!

    这个题目巧妙之处在于用二进制的每个位1,0分别表示bug的有无,以及实施补丁对相应bug的要求以及实施后的对bug的影响. 软件bug的状态:1表示相应bug仍然存在,0表示已经修复.这样可以将软件的 ...

  8. Spring事务管理--多个ORM框架在使用时的情况分析

    公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在 ...

  9. php 模拟斗地主发牌简单易懂

    闲来无聊,就写了这个方法,也算是熟悉下php的数组操作,还请各位大神多指教.$arr 数组,好像有点问题,应该 2=>'方片2',3=>'梅花2',4=>'红心2',5=>'黑 ...

  10. 【HDOJ】1069 Monkey and Banana

    DP问题,我是按照边排序的,排序既要考虑x也要考虑y,同时在每个面中,长宽也要有序.还有注意状态转移,当前高度并不是之前的最大block叠加的高度,而是可叠加最大高度+当前block高度或者是当前bl ...