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<stdio.h>
#include<iostream>
#include<map>
#include<set>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std; int gcd(int a,int b)
{
if(b==)return a;
return gcd(b,a%b);
} long long sum1(int x,int y,int p)//求区间[x,y]中p的倍数的和
{
if(p>y)return ;
int t1=x/p;
int t2=y/p;
if(t1*p<x)t1++;
if(t2<t1)return ;
long long sum=;
sum=(long long)p*(t1+t2)*(t2-t1+)/;
return sum;
} const int MAXN=;
int prime[MAXN+];
int getPrime()//得到小于等于MAXN的素数,prime[0]存放的是个数
{
memset(prime,,sizeof(prime));
for(int i=;i<=MAXN;i++)
{
if(!prime[i]) prime[++prime[]]=i;
for(int j=;j<=prime[]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i]=;
if(i%prime[j]==) break;
}
}
return prime[];
}
long long factor[][];
int facCnt;
int getFactors(long long x)//把x进行素数分解
{
facCnt=;
long long tmp=x;
for(int i=;prime[i]<=tmp/prime[i];i++)
{
factor[facCnt][]=;
if(tmp%prime[i]==)
{
factor[facCnt][]=prime[i];
while(tmp%prime[i]==)
{
factor[facCnt][]++;
tmp/=prime[i];
}
facCnt++;
}
}
if(tmp!=)
{
factor[facCnt][]=tmp;
factor[facCnt++][]=;
}
return facCnt;
} long long SS(int s,int x,int y)
//求[x,y]之间是素因子倍数的和。素因子的状态是s,0表示没有这个素因子,
//1表示有。容斥原理。先不管加减,先奇数加,偶数加,最后按照正负去调整就好了。
{
long long ans=;
int cnt=;
int p=;
for(int i=;i<facCnt;i++)
{
if(s&(<<i))
{
cnt++;
p*=factor[i][]; //由于类似2,3,会导致在计算6时重复计算,所以所有素因子都要计算一遍
}
}
ans=sum1(x,y,p);
//printf("%d %d * %d *\n",x,y,p);
if(cnt%)ans=-ans;
//printf("**%lld\n",ans);
return ans;
} long long solve1(int x,int y,int p)//求[x,y]之间和p不互素的数的和
{
getFactors(p);
long long ans=;
for(int i=;i<(<<facCnt);i++)
ans+=SS(i,x,y);
if(ans<)ans=-ans;
return ans;
}
map<int,int>mp;
map<int,int>::iterator it; long long query(int x,int y,int p)//查询。改变被修改了的就可以了
{
long long ans=(long long)(x+y)*(y-x+)/; //原本的和
long long temp=solve1(x,y,p); //与p不互质的数的和
ans-=temp;
for(it=mp.begin();it!=mp.end();it++)
{
int t1=it->first;
if(t1<x||t1>y)continue;
int t2=it->second;
if(gcd(t1,p)==)ans-=t1;//本来互素的要减掉
if(gcd(t2,p)==)ans+=t2;//修改后互素的要加上
}
return ans;
}
int main()
{
getPrime();
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int T;
int n,m;
int x,y,p;
int t;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
mp.clear();
while(m--)
{
scanf("%d",&t);
if(t==)
{
scanf("%d%d%d",&x,&y,&p);
if(x>y)swap(x,y);
printf("%I64d\n",query(x,y,p));
}
else
{
scanf("%d%d",&x,&p);
mp[x]=p;
}
}
}
return ;
}
hdu 4407 容斥原理的更多相关文章
- GCD HDU - 1695 容斥原理(复杂度低的版本)
题意: 让你从区间[a,b]里面找一个数x,在区间[c,d]里面找一个数y.题目上已经设定a=b=1了.问你能找到多少对GCD(x,y)=k.x=5,y=7和y=5,x=7是同一对 题解: 弄了半天才 ...
- - Visible Trees HDU - 2841 容斥原理
题意: 给你一个n*m的矩形,在1到m行,和1到n列上都有一棵树,问你站在(0,0)位置能看到多少棵树 题解: 用(x,y)表示某棵树的位置,那么只要x与y互质,那么这棵树就能被看到.不互质的话说明前 ...
- HDU 4407 Sum 容斥原理
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...
- HDU 4407
http://acm.hdu.edu.cn/showproblem.php?pid=4407 把修改和询问分成两部分解决 询问求区间内与p不互素的和,和求个数一样,用容斥原理解决,只不过做容斥的时候把 ...
- HDU 4059 容斥原理+快速幂+逆元
E - The Boss on Mars Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- hdu 4407 Sum
http://acm.hdu.edu.cn/showproblem.php?pid=4407 题意:给定初始n个数1..n,两个操作,①1 x y p 询问第x个数到第y个数中与p互质的数的和; ② ...
- HDU 1796 容斥原理 How many integers can you find
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1796 处男容斥原理 纪念一下 TMD看了好久才明白DFS... 先贴代码后解释 #includ ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- HDU 1796 容斥原理
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
随机推荐
- DNA序列编码中Hairpin的定义和计算
DNA序列编码中Hairpin的定义和计算 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [1] 张凯. DNA计算核酸编码优化及算法设计[D]. 2008. [2] Shin, ...
- JavaScript内部原理实践——真的懂JavaScript吗?(转)
通过翻译了Dmitry A.Soshnikov的关于ECMAScript-262-3 JavaScript内部原理的文章, 从理论角度对JavaScript中部分特性的内部工作机制有了一定的了解. 但 ...
- 【干货】Windows系统信息收集篇
市场分析:计算机取证,就是应急响应.而应急响应的市场在于黑产的攻击频率.在当今的社会里,更多的人为了钱铤而走险的比比皆是,这个市场随着比特币,大数据,物联网的来临,规模将更加的庞大与有组织性.这将导致 ...
- pip --version问题
安装pip之后,在cmd下输入 pip --version始终提示: Unknown option:versionDid not provide a command自己安装步骤没错,怎么想也不明白,无 ...
- SQLServer 的case when语句使用实现统计
已知有表game_info 如下 date_info result_info 2018-2-4 win 2018-2-4 lose 2018-2-4 win 2018-2-4 lose 2018-2- ...
- kafka查看消费数据
一.如何查看 在老版本中,使用kafka-run-class.sh 脚本进行查看.但是对于最新版本,kafka-run-class.sh 已经不能使用,必须使用另外一个脚本才行,它就是kafka-co ...
- printf 字符串格式
摘自:http://www.cppblog.com/API/archive/2013/07/18/201923.html 首先 long long是C99标准新规定的.不少编译器还不支持,Micros ...
- **CI中自动类加载的用法总结
总结: 哪一个类中用到某一个类,就在构造函数中加载这个类,比如m_attach,C_Feed类中有用到,那么就在构造函数中加载 控制器: class C_Feed extends CI_Control ...
- Vue.Js的用户体验优化
一次基于Vue.Js的用户体验优化 一.写在前面 半年以前,第一次在项目上实践VueJs,由于在那之前,没有Angular,avalon等框架的实践经验,所以在Vue的使用上,没有给自己总结出更多 ...
- 【LOJ】#2526. 「HAOI2018」苹果树
题解 这计数题多水啊我怎么调了那么久啊 我不想老年化啊QAQ (注意这里的二叉树带标号) 考虑\(g[i]\)表示\(i\)个点二叉树所有节点的深度和,\(f[i]\)表示\(i\)个点的二叉树两两节 ...