HDU - 4407 Sum (容斥)
题意:初始序列[1..N](1<=N<=4e5),支持两种操作:1.求区间[x,y]内与p互素的数之和; 2。将x位置的数变为c。
分析:很容易把人骗到线段树的思维中,而实际上操作2单点的修改可以用map去记录,之后统计和的时候再去检查是否有给定区间内的数被修改。
区间[x,y]内与p互素的数之和,可以转化成求与p不互素的数之和。设p的质因子有[f1,f2...fk],则若干个质因子积的倍数一定不与p互素,用容斥求出在[x,y]区间内与p的质因子积的倍数。根据等差数列求和算出[x,y]区间的和,并检查区间内被修改的值,若原值与p互素,则要减去;若修改后的值与p互素,则要加上。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e5+;
typedef long long LL;
map<int,int> vz; LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
} LL sum1(LL a1,LL an) //等差数列求和
{
LL n = an-a1+;
LL res = (a1 + an) * n / ;
return res;
} LL sum2(LL l,LL r,LL val) //等比数列求和
{
int n = ( r / val ) - ( ( l - ) / val ) ;
int a1 = ( l % val == )? l : ( val - l % val ) + l ;
int an = r - r % val ;
LL res = (LL)( a1 + an ) * (LL)n / ;
return res;
} LL cal(int l,int r,int p)
{
vector<int> fac;
int tmp = p;
for(int i=;i*i<=tmp;++i){
if(tmp%i==){
fac.push_back(i);
while(tmp%i==) tmp/=i;
}
}
if(tmp>) fac.push_back(tmp);
int cnt = fac.size();
int up = <<cnt;
LL res=;
for(int i=;i<up;++i){ //容斥统计与p不互素的数的和
int bits = ;
LL ji = ;
for(int j=;j<cnt;++j){
if(i&(<<j)){
bits++;
ji *= fac[j];
}
}
LL sum= sum2(l,r,ji);
if(bits &) res+=sum;
else res-=sum;
}
res = sum1(l,r)-res;
for(auto &v :vz){
if(v.first<l) continue;
if(v.first>r) break;
if(gcd(v.first,p)==) res-=v.first; //多加了要减去
if(gcd(v.second,p)==) res+=v.second; //修改后的结果与p互质,加上
}
return res;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T; scanf("%d",&T);
while(T--){
int N,M; scanf("%d%d",&N,&M);
vz.clear();
int op,x,y,p,c;
while(M--){
scanf("%d",&op);
if(op==){
scanf("%d%d%d",&x,&y,&p);
if(x>y) swap(x,y);
printf("%lld\n",cal(x,y,p));
}
else{
scanf("%d%d",&x,&c);
vz[x] =c; //记录修改
}
}
}
return ;
}
HDU - 4407 Sum (容斥)的更多相关文章
- hdu 4407 Sum 容斥+当前离线
乞讨X-Y之间p素数,,典型的纳入和排除问题,列的求和运算总和的数,注意,第一项是最后一个项目数. 如果不改变到第一记录的答案,脱机处理,能保存查询,候,遇到一个操作1,就遍历前面的操作.把改动加上去 ...
- hdu 5514 Frogs(容斥)
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 2588 思维 容斥
求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...
- HDU 5213 分块 容斥
给出n个数,给出m个询问,询问 区间[l,r] [u,v],在两个区间内分别取一个数,两个的和为k的对数数量. $k<=2*N$,$n <= 30000$ 发现可以容斥简化一个询问.一个询 ...
- 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互质的数的个数. ...
随机推荐
- JFinal使用笔记3-注册和登录功能开发记录
首页 开源项目 问答 代码 博客 翻译 资讯 移动开发 招聘 城市圈 当前访客身份:游客 [ 登录 | 加入开源中国 ] 当前访客身份: 游客 [ 登录 | 加入开源中国 ] 软件 土龙 关注 ...
- PHP中钩子函数的实现与认识
PHP中钩子函数的实现与认识 分类:PHP编程 作者:rming 时间:2014-09-21 假如有这么一段程序: function fun(){ fun1(); fun2(); } 首先程序 ...
- 【BZOJ】3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)
http://www.lydsy.com/JudgeOnline/problem.php?id=3404 写挫好几次.... 裸的博弈论即可.. #include <cstdio> #in ...
- Json.net操作json
string str="{\"size\":15,\"query\":{\"match\":{\"data.query. ...
- 2015InfoQ软件大会技术记录
前述 参加infoq软件大会,最大的感触就是,互联网行业的技术发展日新月异:由市场痛点.用户痛点.开发痛点所驱动的技术变革更是遍地开花.新的技术新的思维也是层出不穷:大会中频频提到的高扩展高可用架构. ...
- LINQPad_批量修改图片名称
用到这个工具是在后台批量修改图片名称的时候 下载并安装LINQPad. 这里要注意:在复制path路径的时候C:\xampp\htdocs\day01\angularjs_day01_am\angul ...
- My97DatePicker日历控件在iframe提示没有权限的问
修改 WdatePicker.js 文件 $crossFrame:false, 值设成 false,原来的值是 true
- 【BZOJ4504】K个串 可持久化线段树+堆
[BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
- iOS 程序切换后台
1. -(void)animationFinished:(NSString*)animationid finished:(NSNumber*)finished context:(void*)conte ...
- XML 之快速入门
XML 简介 - XML, 即可扩展标记语言(eXtensible Markup Language), 是一种标记语言. - 标记型语言: 使用标签进行操作 - 可扩展: XML 的标签可以自定义 - ...