乞讨X-Y之间p素数,,典型的纳入和排除问题,列的求和运算总和的数,注意,第一项是最后一个项目数。

如果不改变到第一记录的答案,脱机处理,能保存查询,候,遇到一个操作1,就遍历前面的操作。把改动加上去,注意要判重。仅仅保留最后一次改动。

  1. #include <stdio.h>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iostream>
  6. #include<cstring>
  7. using namespace std;
  8. typedef long long ll;
  9. ll ans;
  10. int pri[1234];
  11. int top;
  12. int n,m,a,b,c;
  13. ll gcd(ll a,ll b)
  14. {
  15. return a%b==0?
  16.  
  17. b:gcd(b,a%b);
  18. }
  19. ll cal(ll num)
  20. {
  21. int x=a;
  22. int y=b;
  23. int fir;
  24. int tmp=y/num-x/num;
  25. if(x%num==0) fir=x,tmp++;
  26. else fir=num*(x/num+1);
  27. if(fir>y) return 0;
  28. int en=fir+(tmp-1)*num;
  29. return (fir+en)*1ll*tmp/2;
  30. }
  31. void dfs(int p,ll num,int flag)
  32. {
  33. if(num>b) return;
  34. if(p) {ans+=flag*cal(num);}
  35. for(int i=p+1;i<top;i++)
  36. {
  37. dfs(i,pri[i]*num,-flag);
  38. }
  39. }
  40. ll out[1234];
  41. int d[1234][4];
  42. int rec[1234][2];
  43. bool vis[400005];
  44. bool V[400005];
  45. int prime[400005];
  46. int topp=0;
  47. void sieve(int n)
  48. {
  49. int m= (int)sqrt(n+0.5);
  50. for(int i=2;i<=m;i++)
  51. {
  52. if(!V[i])
  53. {
  54. for(int j=i*i;j<=n;j+=i)
  55. V[j]=1;
  56. }
  57. }
  58. V[1]=1;
  59. for(int i=2;i<=400000;i++)
  60. {
  61. if(V[i]==0) prime[topp++]=i;
  62. }
  63. }
  64. int main()
  65. {
  66. sieve(400005);
  67. int cas;
  68. scanf("%d",&cas);
  69. while(cas--)
  70. {
  71. scanf("%d%d",&n,&m);
  72. int op;
  73. for(int i=1;i<=m;i++)
  74. {
  75. scanf("%d",&op);
  76. d[i][0]=op;
  77. if(op==1)
  78. {
  79. ans=0;
  80. top=1;
  81. scanf("%d%d%d",&a,&b,&c);
  82. d[i][1]=a;
  83. d[i][2]=b;
  84. d[i][3]=c;
  85. if(c==1)
  86. {
  87. out[i]=(a+b)*1ll*(b-a+1)/2;
  88. continue;
  89. }
  90. for(int j=0;prime[j]*prime[j]<=c;j++)
  91. {
  92. if(V[c]==0) break;
  93. if(c%prime[j]==0)
  94. {
  95. pri[top++]=prime[j];
  96. while(c%prime[j]==0) c/=prime[j];
  97. }
  98. }
  99. if(c>1) pri[top++]=c;
  100. dfs(0,1,-1);
  101. out[i]=(a+b)*1ll*(b-a+1)/2-ans;
  102. }
  103. else
  104. {
  105. scanf("%d%d",&b,&c);
  106. d[i][1]=b;
  107. d[i][2]=c;
  108. }
  109. }
  110. for(int i=1;i<=m;i++)
  111. {
  112. if(d[i][0]==1)
  113. {
  114. ll ans=out[i];
  115. int cnt=0;
  116. for(int j=i-1;j>=1;j--)
  117. {
  118. if(d[j][0]==2&&!vis[d[j][1]])
  119. {
  120. vis[d[j][1]]=true;
  121. rec[cnt][0]=d[j][1];
  122. rec[cnt][1]=d[j][2];
  123. cnt++;
  124. }
  125. }
  126. for(int j=0;j<cnt;j++)
  127. {
  128. vis[rec[j][0]]=false;
  129. if(rec[j][0]>=d[i][1]&&rec[j][0]<=d[i][2])
  130. {
  131. ans-=( gcd(rec[j][0],d[i][3])==1?rec[j][0]:0 );
  132. ans+=( gcd(rec[j][1],d[i][3])==1?rec[j][1]:0 );
  133. }
  134. }
  135. printf("%I64d\n",ans);
  136. }
  137. }
  138. }
  139. return 0;
  140. }
  141. /*
  142. 123
  143. 100 1
  144. 1 1 10 11
  145. 2 2 3
  146. 2 2 5
  147. 1 1 10 2
  148. */

版权声明:本文博主原创文章,博客,未经同意不得转载。

hdu 4407 Sum 容斥+当前离线的更多相关文章

  1. HDU - 4407 Sum (容斥)

    题意:初始序列[1..N](1<=N<=4e5),支持两种操作:1.求区间[x,y]内与p互素的数之和: 2.将x位置的数变为c. 分析:很容易把人骗到线段树的思维中,而实际上操作2单点的 ...

  2. hdu 5514 Frogs(容斥)

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. HDU 5213 分块 容斥

    给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...

  4. HDU 2588 思维 容斥

    求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...

  5. HDU 5514 Frogs 容斥定理

    Frogs Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5514 De ...

  6. HDU 1695 GCD 容斥

    GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...

  7. hdu 1695 GCD 容斥+欧拉函数

    题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ...

  8. HDU - 4135 Co-prime 容斥定理

    题意:给定区间和n,求区间中与n互素的数的个数, . 思路:利用容斥定理求得先求得区间与n互素的数的个数,设表示区间中与n互素的数的个数, 那么区间中与n互素的数的个数等于.详细分析见求指定区间内与n ...

  9. HDU 4135 Co-prime (容斥+分解质因子)

    <题目链接> 题目大意: 给定区间[A,B](1 <= A <= B <= 10 15)和N(1 <=N <= 10 9),求出该区间中与N互质的数的个数. ...

随机推荐

  1. view和activity的区别(转)

    activity相当于控制部分,view相当于显示部分.两者之间是多对多的关系,所有东西必须用view来显示. viewGroup继承自view,实现了ViewManager,ViewParent接口 ...

  2. android实现应用程序仅仅有在第一次启动时显示引导界面

    概述 SharedPreferences的使用很easy,可以轻松的存放数据和读取数据.SharedPreferences仅仅能保存简单类型的数据,比如,String.int等.通常会将复杂类型的数据 ...

  3. leetcode先刷_Climbing Stairs

    水的问题. 以为很常见.青蛙跳楼梯.能跳一步可以跳两步,它实际上是一个斐波那契数. 注意.空间O(1). class Solution { public: int climbStairs(int n) ...

  4. flex4 一些项目使用的技术

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  5. Vim配置说明

    使用这些天一直vim,我认为vim这是一个非常强大的编辑器,尤其是后配置. 互联网参考大牛个月vim配置,然后更改加入了一部分,形成了自己的配置.让Vim变的更强大. 详细有下面几个特点: 1.自己主 ...

  6. 重写onBackPressed方法

    android手机back按键响应方法重构: long exitTime = System.currentTimeMillis() - 2000; public void onBackPressed( ...

  7. schedule vs scheduleAtFixedRate

    最好的方法是在两者之间区分 timer灵感时间设定过去时间T,scheduleAtFixedRate将从T现在所有的任务中运行,schedule而该任务将只运行从现在开始计时. public clas ...

  8. DDDLite的权限管理

    领域驱动设计实战—基于DDDLite的权限管理   在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒 ...

  9. 最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...

  10. robot framework 使用三:他们主动浏览器的兼容性

    robot framework 浏览器兼容性测试 上图中黄色圈的地方默认什么都不写,是firefox浏览器.写上ie就是ie浏览器了 firefox最新版本号即可,ie须要设置: 1. IE选项设置的 ...