Bzoj-2820 YY的GCD Mobius反演,分块
2013-08-25 11:56
302 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2820
题意:多次询问,求1<=x<=N, 1<=y<=M且gcd(x,y)为质数有多少对。
首先,
由于这里是多次询问,并且数据很大,显然不能直接求解,需要做如下处理。。
整数的除法是满足结合律的,然后我们设T=p*d,有:
注意到后面部分是可以预处理出来的,那么整个ans就可以用分块处理来求了,设
那么有
,考虑当p|x时,根据莫比菲斯mu(x)的性质,px除以其它非p的质数因数都为0,所以g(px)=mu(x)。当p!|x时,除数为p时为mu(x),否则其它的和为-g(x),因为这里还乘了一个p所以要变反。然后O(n)预处理下就可以了。。
题意:多次询问,求1<=x<=N, 1<=y<=M且gcd(x,y)为质数有多少对。
首先,
由于这里是多次询问,并且数据很大,显然不能直接求解,需要做如下处理。。
整数的除法是满足结合律的,然后我们设T=p*d,有:
注意到后面部分是可以预处理出来的,那么整个ans就可以用分块处理来求了,设
那么有
,考虑当p|x时,根据莫比菲斯mu(x)的性质,px除以其它非p的质数因数都为0,所以g(px)=mu(x)。当p!|x时,除数为p时为mu(x),否则其它的和为-g(x),因为这里还乘了一个p所以要变反。然后O(n)预处理下就可以了。。
//STATUS:C++_AC_3660MS_274708KB #include <functional> #include <algorithm> #include <iostream> //#include <ext/rope> #include <fstream> #include <sstream> #include <iomanip> #include <numeric> #include <cstring> #include <cassert> #include <cstdio> #include <string> #include <vector> #include <bitset> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <list> #include <set> //#include <map> using namespace std; //#pragma comment(linker,"/STACK:102400000,102400000") //using namespace __gnu_cxx; //define #define pii pair<int,int> #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define PI acos(-1.0) //typedef typedef long long LL; typedef unsigned long long ULL; //const const int N=10000010; const int INF=0x3f3f3f3f; const int MOD=100000,STA=8000010; const LL LNF=1LL<<60; const double EPS=1e-8; const double OO=1e15; const int dx[4]={-1,0,1,0}; const int dy[4]={0,1,0,-1}; const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //Daily Use ... inline int sign(double x){return (x>EPS)-(x<-EPS);} template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T lcm(T a,T b,T d){return a/d*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);} template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);} template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));} template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));} //End LL sum ,g ; int isprime ,mu ,prime ; int cnt; int T,n,m; void Mobius(int n) { int i,j; //Init isprime ,mu ,prime ,全局变量初始为0 cnt=0;mu[1]=1; for(i=2;i<=n;i++){ if(!isprime[i]){ prime[cnt++]=i; mu[i]=-1; g[i]=1; } for(j=0;j<cnt && i*prime[j]<=n;j++){ isprime[i*prime[j]]=1; if(i%prime[j]){ mu[i*prime[j]]=-mu[i]; g[i*prime[j]]=mu[i]-g[i]; } else { mu[i*prime[j]]=0; g[i*prime[j]]=mu[i]; break; } } } for(i=1;i<=n;i++)sum[i]=sum[i-1]+g[i]; } int main(){ // freopen("in.txt","r",stdin); int i,j,la; LL ans; Mobius(10000000); scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); if(n>m)swap(n,m); ans=0; for(i=1;i<=n;i=la+1){ la=Min(n/(n/i),m/(m/i)); ans+=(sum[la]-sum[i-1])*(n/i)*(m/i); } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&amp;&amp;bzoj 2820 YY的GCD&amp;&amp;BZOJ 3529 数表)
- [莫比乌斯反演+分块求和] BZOJ2820: YY的GCD
- 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)
- BZOJ-2820-YY的GCD-(Mobius反演)
- 【反演复习计划】【bzoj2820】YY的GCD
- BZOJ2820 YY的GCD 莫比乌斯反演
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
- 【莫比乌斯反演】BZOJ2820 YY的GCD
- bzoj 2820: YY的GCD 莫比乌斯反演
- bzoj2820: YY的GCD 莫比乌斯反演
- BZOJ 2820 YY的GCD 莫比乌斯反演
- BZOJ 2820 YY的GCD | 莫比乌斯反演
- [BZOJ2820]YY的GCD|莫比乌斯反演
- bzoj2820 YY的GCD(反演)
- [bzoj2820]:YY的GCD(莫比乌斯反演)
- BZOJ 2820 YY的GCD 莫比乌斯反演
- 【bzoj2820】YY的GCD 线性筛法+莫比乌斯反演+数论分块
- 【BZOJ2820】YY的GCD [莫比乌斯反演]
- 【莫比乌斯反演】BZOJ2820 YY的GCD
- bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛