题意:

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 容斥原理的更多相关文章

  1. GCD HDU - 1695 容斥原理(复杂度低的版本)

    题意: 让你从区间[a,b]里面找一个数x,在区间[c,d]里面找一个数y.题目上已经设定a=b=1了.问你能找到多少对GCD(x,y)=k.x=5,y=7和y=5,x=7是同一对 题解: 弄了半天才 ...

  2. - Visible Trees HDU - 2841 容斥原理

    题意: 给你一个n*m的矩形,在1到m行,和1到n列上都有一棵树,问你站在(0,0)位置能看到多少棵树 题解: 用(x,y)表示某棵树的位置,那么只要x与y互质,那么这棵树就能被看到.不互质的话说明前 ...

  3. HDU 4407 Sum 容斥原理

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

  4. HDU 4407

    http://acm.hdu.edu.cn/showproblem.php?pid=4407 把修改和询问分成两部分解决 询问求区间内与p不互素的和,和求个数一样,用容斥原理解决,只不过做容斥的时候把 ...

  5. HDU 4059 容斥原理+快速幂+逆元

    E - The Boss on Mars Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  6. hdu 4407 Sum

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

  7. HDU 1796 容斥原理 How many integers can you find

    题目连接   http://acm.hdu.edu.cn/showproblem.php?pid=1796 处男容斥原理  纪念一下  TMD看了好久才明白DFS... 先贴代码后解释 #includ ...

  8. 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表示 ...

  9. HDU 1796 容斥原理

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

随机推荐

  1. php拾遗: 类型约束

    突然间什么都不想干,感觉就像来大姨夫一样..但是又不能断了每个工作日都写博客的习惯..所以今天水一下吧. PHP用了快2年了,但是这东西竟然第一次看到,突然间,觉得自己有掉回战五渣的行列了.翻开官方文 ...

  2. C. NN and the Optical Illusion(几何)

    题目链接:http://codeforces.com/contest/1100/problem/C 题目大意:给你n和r,n指的是有n个圆围在里面的圆的外面,r指的是里面的圆的半径,然后让你求外面的圆 ...

  3. 让浏览器重新下载css文件,解决不刷新缓存的问题

    网站页面源代码中的css文件和js文件后面带一个问号,后面跟着一连串数字或字符,问号起不到实际作用,仅能当作后缀,如果用问号加参数的方法,可以添加版本号等信息 它的作用有:1.作为版本号,让自己方便记 ...

  4. Java初转型-SSM配置文件

    文章来源:http://www.cnblogs.com/wxisme/p/4924561.html web.xml的配置                                        ...

  5. eclipse中可以导入其它工具编写的RobotFramework脚本吗?

    在Robotframework的官方网站中,提供了非常多的编辑RF的工具.比如Ride,eclipse,sublime,notepad++等. 网上查到的资料,大部分都是Ride这个编辑工具的使用.在 ...

  6. 洛谷 P5206: bzoj 5475: LOJ 2983: [WC2019] 数树

    一道技巧性非常强的计数题,历年WC出得最好(同时可能是比较简单)的题目之一. 题目传送门:洛谷P5206. 题意简述: 给定 \(n, y\). 一张图有 \(|V| = n\) 个点.对于两棵树 \ ...

  7. oracle 级联查询 根路径

    级联查询有很多教程示例,但是没有找到求特定子孙到根的路径的例子,折腾了一番总算想出方法了. 现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关 ...

  8. vue 兼容IE报错解决方案

    IE 页面空白 报错信息 此时页面一片空白 报错原因 Babel 默认只转换新的 JavaScript 语法(如箭头函数),而不转换新的 API ,比如 Iterator.Generator.Set. ...

  9. javascript-词法分析解析

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 在内部局域网内搭建HTTPs

    在内部局域网内搭建HTTPs 配置环境 Windows版本:Windows Server 2008 R2 Standard Service Pack 1 系统类型:       64 位操作系统 内存 ...