zoukankan      html  css  js  c++  java
  • [bzoj1101] [POI2007]Zap

    Description

      FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。

    Input

      第一行包含一个正整数n,表示一共有n组询问。(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个正整数,分别为a,b,d。(1<=d<=a,b<=50000)

    Output

      对于每组询问,输出到输出文件zap.out一个正整数,表示满足条件的整数对数。

    Sample Input

    2
    4 5 2
    6 4 3
    

    Sample Output

    3
    2
    

    Solution

    [egin{align} ans=&sum_{i=1}^{n/d}sum_{j=1}^{m/d}[gcd(i,j)=1]\ =&sum_{i=1}^{n/d}sum_{j=1}^{m/d}sum_{d|i&d|j}mu(d)\ =&sum_{t=1}^{min(lfloorfrac{n}{d} floor,lfloorfrac{m}{d} floor)}mu(t)lfloorfrac{n}{dt} floorlfloorfrac{m}{dt} floor end{align} ]

    预处理(mu)前缀和就好了。复杂度(O(n+Tsqrt{n}))

    #include<bits/stdc++.h>
    using namespace std;
    
    #define ONLINE_JUDGE
    
    #ifdef ONLINE_JUDGE
    #define getchar() ((p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2)?EOF:*p1++)
    #endif
    
    namespace fast_IO {
    	char buf[1<<21],*p1=buf,*p2=buf;
    
    	template <typename T> inline void read(T &x) {
    		x=0;T f=1;char ch=getchar();
    		for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    		for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    	}
    	template <typename T,typename... Args> inline void read(T& x,Args& ...args) {
    		read(x),read(args...);
    	}
    
    	char buf2[1<<21],a[80];int p,p3=-1;
    
    	inline void flush() {fwrite(buf2,1,p3+1,stdout),p3=-1;}
    	template <typename T> inline void write(T x) {
    		if(p3>(1<<20)) flush();
    		if(x<0) buf2[++p3]='-',x=-x;
    		do {a[++p]=x%10+48;} while(x/=10);
    		do {buf2[++p3]=a[p];} while(--p);
    		buf2[++p3]='
    ';
    	}
    	template <typename T,typename... Args> inline void write(T x,Args ...args) {
    		write(x),write(args...);
    	}
    }
    
    using fast_IO :: read;
    using fast_IO :: write;
    using fast_IO :: flush;
    
    const int maxn = 5e4+10;
    
    int pri[maxn],tot,mu[maxn],vis[maxn];
    
    void sieve() {
    	mu[1]=1;
    	for(int i=2;i<maxn;i++) {
    		if(!vis[i]) pri[++tot]=i,mu[i]=-1;
    		for(int j=1;j<=tot&&i*pri[j]<maxn;j++) {
    			vis[i*pri[j]]=1;
    			if(i%pri[j]==0) {mu[i*pri[j]]=0;break;}
    			mu[i*pri[j]]=-mu[i];
    		}
    	}
    	for(int i=1;i<maxn;i++) mu[i]+=mu[i-1];
    }
    
    int main() {
    	sieve();int t;read(t);
    	while(t--) {
    		int n,m,d;
    		read(n,m,d);n/=d,m/=d;
    		int T=1,ans=0;
    		while(T<=n&&T<=m) {
    			int pre=T;T=min(n/(n/T),m/(m/T));
    			ans=ans+(n/T)*(m/T)*(mu[T]-mu[pre-1]);T++;
    		}write(ans);
    	}
    	flush();
    	return 0;
    }
    
  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/hbyer/p/10206882.html
Copyright © 2011-2022 走看看