题意:

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. vue-router基本概念及使用

    index.html: <!DOCTYPE html> <html> <head> <title></title> <meta cha ...

  2. JavaScript编写风格指南 (二)

    七:注释 // 频繁的使用注释有助于他人理解你的代码// 1.代码晦涩难懂// 2.可能被误认为是错误的代码// 3.必要但不明显的针对特定浏览器的代码// 4.对于对象,方法或者属性,生成文档是有必 ...

  3. ios TextField限制输入两位小数

    只需要实现textField的这个代理方法就可以实现 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: ...

  4. 对git简单的认识

    了解git工作区.暂存区.版本库: 其中,使用 git add .就是将文件添加到了暂存区:而git commit -m ‘desc’:将暂存区的文件添加到版本库: 每次更新项目的步骤: 1)每次更新 ...

  5. Python 入门基础7 --文件操作

    今日目录: 一.文件处理 1.什么是文件 2.为何用文件 3.如何用文件 4.文件操作 5.常用方法 6.文件内指针的移动 7.with的使用 一.文件处理 1. 什么是文件 文件是操作系统为用户/应 ...

  6. CentOS安装SVN客户端

    1.检查系统是否已经安装如果安装就卸载 rpm -qa subversion yum remove subversion 2.安装 yum install subversion 3.建立SVN库 mk ...

  7. 【Linux高级驱动】input子系统框架【转】

    转自:http://www.cnblogs.com/lcw/p/3802617.html [1.input子系统框架(drivers\input)] 如何得出某个驱动所遵循的框架?    1) 通过网 ...

  8. nginx:支持跨域访问

    在http节点中配置: #支持跨域访问 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Header ...

  9. 绘图: matplotlib核心剖析

    参考:http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html http://blog.csdn.net/ywjun0919/artic ...

  10. [转]编译hadoop

    安装maven hadoop源码是使用maven组织管理的,必须下载maven.从maven官网下载,下载地址是http://maven.apache.org/download.cgi,选择 apac ...