hdu 4407 Sum 容斥+当前离线
乞讨X-Y之间p素数,,典型的纳入和排除问题,列的求和运算总和的数,注意,第一项是最后一个项目数。
如果不改变到第一记录的答案,脱机处理,能保存查询,候,遇到一个操作1,就遍历前面的操作。把改动加上去,注意要判重。仅仅保留最后一次改动。
- #include <stdio.h>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- #include <iostream>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- ll ans;
- int pri[1234];
- int top;
- int n,m,a,b,c;
- ll gcd(ll a,ll b)
- {
- return a%b==0?
- b:gcd(b,a%b);
- }
- ll cal(ll num)
- {
- int x=a;
- int y=b;
- int fir;
- int tmp=y/num-x/num;
- if(x%num==0) fir=x,tmp++;
- else fir=num*(x/num+1);
- if(fir>y) return 0;
- int en=fir+(tmp-1)*num;
- return (fir+en)*1ll*tmp/2;
- }
- void dfs(int p,ll num,int flag)
- {
- if(num>b) return;
- if(p) {ans+=flag*cal(num);}
- for(int i=p+1;i<top;i++)
- {
- dfs(i,pri[i]*num,-flag);
- }
- }
- ll out[1234];
- int d[1234][4];
- int rec[1234][2];
- bool vis[400005];
- bool V[400005];
- int prime[400005];
- int topp=0;
- void sieve(int n)
- {
- int m= (int)sqrt(n+0.5);
- for(int i=2;i<=m;i++)
- {
- if(!V[i])
- {
- for(int j=i*i;j<=n;j+=i)
- V[j]=1;
- }
- }
- V[1]=1;
- for(int i=2;i<=400000;i++)
- {
- if(V[i]==0) prime[topp++]=i;
- }
- }
- int main()
- {
- sieve(400005);
- int cas;
- scanf("%d",&cas);
- while(cas--)
- {
- scanf("%d%d",&n,&m);
- int op;
- for(int i=1;i<=m;i++)
- {
- scanf("%d",&op);
- d[i][0]=op;
- if(op==1)
- {
- ans=0;
- top=1;
- scanf("%d%d%d",&a,&b,&c);
- d[i][1]=a;
- d[i][2]=b;
- d[i][3]=c;
- if(c==1)
- {
- out[i]=(a+b)*1ll*(b-a+1)/2;
- continue;
- }
- for(int j=0;prime[j]*prime[j]<=c;j++)
- {
- if(V[c]==0) break;
- if(c%prime[j]==0)
- {
- pri[top++]=prime[j];
- while(c%prime[j]==0) c/=prime[j];
- }
- }
- if(c>1) pri[top++]=c;
- dfs(0,1,-1);
- out[i]=(a+b)*1ll*(b-a+1)/2-ans;
- }
- else
- {
- scanf("%d%d",&b,&c);
- d[i][1]=b;
- d[i][2]=c;
- }
- }
- for(int i=1;i<=m;i++)
- {
- if(d[i][0]==1)
- {
- ll ans=out[i];
- int cnt=0;
- for(int j=i-1;j>=1;j--)
- {
- if(d[j][0]==2&&!vis[d[j][1]])
- {
- vis[d[j][1]]=true;
- rec[cnt][0]=d[j][1];
- rec[cnt][1]=d[j][2];
- cnt++;
- }
- }
- for(int j=0;j<cnt;j++)
- {
- vis[rec[j][0]]=false;
- if(rec[j][0]>=d[i][1]&&rec[j][0]<=d[i][2])
- {
- ans-=( gcd(rec[j][0],d[i][3])==1?rec[j][0]:0 );
- ans+=( gcd(rec[j][1],d[i][3])==1?rec[j][1]:0 );
- }
- }
- printf("%I64d\n",ans);
- }
- }
- }
- return 0;
- }
- /*
- 123
- 100 1
- 1 1 10 11
- 2 2 3
- 2 2 5
- 1 1 10 2
- */
版权声明:本文博主原创文章,博客,未经同意不得转载。
hdu 4407 Sum 容斥+当前离线的更多相关文章
- HDU - 4407 Sum (容斥)
题意:初始序列[1..N](1<=N<=4e5),支持两种操作:1.求区间[x,y]内与p互素的数之和: 2.将x位置的数变为c. 分析:很容易把人骗到线段树的思维中,而实际上操作2单点的 ...
- hdu 5514 Frogs(容斥)
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5213 分块 容斥
给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...
- HDU 2588 思维 容斥
求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...
- HDU 5514 Frogs 容斥定理
Frogs Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5514 De ...
- HDU 1695 GCD 容斥
GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...
- 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, ...
- HDU - 4135 Co-prime 容斥定理
题意:给定区间和n,求区间中与n互素的数的个数, . 思路:利用容斥定理求得先求得区间与n互素的数的个数,设表示区间中与n互素的数的个数, 那么区间中与n互素的数的个数等于.详细分析见求指定区间内与n ...
- HDU 4135 Co-prime (容斥+分解质因子)
<题目链接> 题目大意: 给定区间[A,B](1 <= A <= B <= 10 15)和N(1 <=N <= 10 9),求出该区间中与N互质的数的个数. ...
随机推荐
- view和activity的区别(转)
activity相当于控制部分,view相当于显示部分.两者之间是多对多的关系,所有东西必须用view来显示. viewGroup继承自view,实现了ViewManager,ViewParent接口 ...
- android实现应用程序仅仅有在第一次启动时显示引导界面
概述 SharedPreferences的使用很easy,可以轻松的存放数据和读取数据.SharedPreferences仅仅能保存简单类型的数据,比如,String.int等.通常会将复杂类型的数据 ...
- leetcode先刷_Climbing Stairs
水的问题. 以为很常见.青蛙跳楼梯.能跳一步可以跳两步,它实际上是一个斐波那契数. 注意.空间O(1). class Solution { public: int climbStairs(int n) ...
- flex4 一些项目使用的技术
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- Vim配置说明
使用这些天一直vim,我认为vim这是一个非常强大的编辑器,尤其是后配置. 互联网参考大牛个月vim配置,然后更改加入了一部分,形成了自己的配置.让Vim变的更强大. 详细有下面几个特点: 1.自己主 ...
- 重写onBackPressed方法
android手机back按键响应方法重构: long exitTime = System.currentTimeMillis() - 2000; public void onBackPressed( ...
- schedule vs scheduleAtFixedRate
最好的方法是在两者之间区分 timer灵感时间设定过去时间T,scheduleAtFixedRate将从T现在所有的任务中运行,schedule而该任务将只运行从现在开始计时. public clas ...
- DDDLite的权限管理
领域驱动设计实战—基于DDDLite的权限管理 在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒 ...
- 最小二乘法拟合java实现源程序(转)
因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...
- robot framework 使用三:他们主动浏览器的兼容性
robot framework 浏览器兼容性测试 上图中黄色圈的地方默认什么都不写,是firefox浏览器.写上ie就是ie浏览器了 firefox最新版本号即可,ie须要设置: 1. IE选项设置的 ...