http://acm.hdu.edu.cn/showproblem.php?pid=4407

把修改和询问分成两部分解决

询问求区间内与p不互素的和,和求个数一样,用容斥原理解决,只不过做容斥的时候把每一段的个数改成每一段的和,这个求和的方式我一下写搓了,导致这道题坑了很久

修改用map记录,每次扫一遍即可,原数和c互素就减掉,修改完的数和c互素就加上去,logn*m^2的复杂度

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <cmath> using namespace std; typedef __int64 ll; ll gcd(ll a,ll b){
return b==?a:gcd(b,a%b);
} ll sum(ll l,ll r,ll k){
ll num=r/k-(l-)/k;
ll front;
if(l%k==)front=l;
else front=(k-l%k)+l;
ll rear=r-r%k;
return (front+rear)*num/;
} ll gao(ll l,ll r,ll n){
vector <ll> v;
for(ll i=;i*i<=n;i++){
if(n%i==){
v.push_back(i);
while(n%i==)n/=i;
}
}
if(n>)v.push_back(n);
int m=v.size();
ll res=;
for(int i=;i<(<<m);i++){
int cnt=;
ll val=;
for(int j=;j<m;j++){
if(i&(<<j)){
cnt++;
val*=v[j];
}
}
if(cnt&)res+=sum(l,r,val);
else res-=sum(l,r,val);
}
return (l+r)*(r-l+)/-res;
} map <ll,ll> mp;
map <ll,ll>::iterator it; ll gan(ll x,ll y,ll p){
ll res=gao(x,y,p);
for(it=mp.begin();it!=mp.end();it++){
if(it->first>y || it->first<x)continue;
if(gcd(it->first,p)==)res-=it->first;
if(gcd(it->second,p)==)res+=it->second;
}
return res;
} int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
mp.clear();
while(m--){
int op;
scanf("%d",&op);
ll x,y,p;
if(op==){
scanf("%I64d%I64d%I64d",&x,&y,&p);
if(x>y)swap(x,y);
printf("%I64d\n",gan(x,y,p));
}
else{
scanf("%I64d%I64d",&x,&p);
mp[x]=p;
}
}
}
return ;
}

HDU 4407的更多相关文章

  1. hdu 4407 Sum

    http://acm.hdu.edu.cn/showproblem.php?pid=4407 题意:给定初始n个数1..n,两个操作,①1 x y p  询问第x个数到第y个数中与p互质的数的和; ② ...

  2. HDU 4407 Sum 容斥原理

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  3. hdu 4407 Sum 容斥+当前离线

    乞讨X-Y之间p素数,,典型的纳入和排除问题,列的求和运算总和的数,注意,第一项是最后一个项目数. 如果不改变到第一记录的答案,脱机处理,能保存查询,候,遇到一个操作1,就遍历前面的操作.把改动加上去 ...

  4. hdu 4407 容斥原理

    题意: 1 //一组数据 3 3 //数字为1-3,3次运算 2 2 3 //将2号位变成3 1 1 3 4 //计算1-3号位上与4互质的数的和 1 2 3 6 好题,需要重复练习 #include ...

  5. HDU - 4407 Sum (容斥)

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

  6. [GodLove]Wine93 Tarining Round #6

    比赛链接: http://vjudge.net/contest/view.action?cid=47642#overview 题目来源: 2012 ACM/ICPC Asia Regional Jin ...

  7. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  9. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

随机推荐

  1. Pinyin4Net

    .net使用的汉字转拼音库.Pinyin4Net 是直接从 Pinyin4J 翻译过来的,很多代码甚至是直接copy的. 用法与pinyin4j完全相同,具体请查阅pinyin4j文档. —— 查看更 ...

  2. mvc伪静态<三> IIS配置

    上一篇已经已经讲述了mvc伪静态的代码实现. 下面以IIS 7.5为例演示一下IIS如何配置才能在服务器显示.html的伪静态 一.进入IIS,选择处理程序映射 二添加脚本映射 三根据你的处理程序的版 ...

  3. 报错解决:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    大概分析一般使用了注解才会报这方面的错 1.没有在spring的ApplicationContext.xml中开启注解事务 <!-- 开启注解事务 --> <tx:annotatio ...

  4. 石子归并问题(nyoj737)

    石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的 ...

  5. ie6 ie7 绝对定位 相对定位 层被遮住

    relative 上加上z-index有多个,则z-index递减, absolute层显示则不会被其它标签挡住.

  6. 好用的json-path

    $.store.book[?(@.price < 10)].title Here is a complete overview and a side by side comparison of ...

  7. 时钟 IoTimer

    /* 例程是在运行在DISPATCH_LEVEL的IRQL级别 例程中不能使用分页内存 另外在函数首部使用 #pragma LOCKEDCODE */ #include "Driver.h& ...

  8. LinearLayout练习

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. jsp和servlet的区别

    servlet是服务器端的程序,动态生成html页面发到客户端,但是这样 程序里有许多out.println(),java和html语言混在一起很乱.所以 后来推出了jsp.其实jsp就是servle ...

  10. struts2 ModelDriven 和 Preparable 拦截器

    Struts2 运行流程图-1