题意:

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. Redis记录-Redis介绍

    Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主要特点,使它优越于其它键值数据存储系统 - Redis将其数据库完全保存在内存中, ...

  2. 分布式锁--Redis小试牛刀

    参考文章: Redis分布式锁的正确实现方式 分布式锁看这篇就够了 在这两篇文章的指引下亲测 Redis分布式锁 引言 分布式系统一定会存在CAP权衡问题,所以才会出现分布式锁 什么是CAP理论? 为 ...

  3. Kafka 温故(三):Kafka的内部机制深入(持久化,分布式,通讯协议)

    一.Kafka的持久化 1.数据持久化:     发现线性的访问磁盘(即:按顺序的访问磁盘),很多时候比随机的内存访问快得多,而且有利于持久化:     传统的使用内存做为磁盘的缓存     Kafk ...

  4. HTML5 defer和async的区别

    在HTML页面中插入Javascript的主要方法,就是使用<script>元素.这个元素由Netscape创造并在Netscape Navigator 2中首先实现.后来,这个元素就被加 ...

  5. nginx配置thinkphp5

    [root@z_centos nginx]# /usr/local/nginx/sbin/nginx -hnginx version: nginx/1.13.9thinkphp 5.0.18 [roo ...

  6. PyTorch学习系列(九)——参数_初始化

    from:http://blog.csdn.net/VictoriaW/article/details/72872036 之前我学习了神经网络中权值初始化的方法 那么如何在pytorch里实现呢. P ...

  7. JS脚本病毒调试脚本-Trojan[Downloader]:JS/Nemucod

    1.前言 遇到Trojan[Downloader]:JS/Nemucod需要分析,这款病毒主要为js运行.从网上各种找js调试方法.发现52的帖子还挺沾边的. TrojanDownloader:JS/ ...

  8. AUI-靠谱的移动前端框架

    在如何开发出优秀的APICloud应用中ApiCloud官方推荐我们使用轻量级的框架AUI,针对AUI官网没有提供体验地址 特意编译了一个APP供给大家体验 aui官方地址:http://www.au ...

  9. 大数据系列之并行计算引擎Spark介绍

    相关博文:大数据系列之并行计算引擎Spark部署及应用 Spark: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. Spark是UC Berkeley AMP lab ( ...

  10. LeetCode(23):合并K个排序链表

    Hard! 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2-> ...