zoukankan      html  css  js  c++  java
  • BZOJ1101 POI2007 Zap 【莫比乌斯反演】

    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
    //对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(6,3),(3,3)。



    #include<bits/stdc++.h>
    using namespace std;
    #define N 500010
    int T,a,b,d,tot=0;
    bool mark[N]={0};
    int pri[N],mu[N],F[N]={0};
    void init(){
        mu[1]=1;
        for(int i=2;i<N;i++){
            if(!mark[i])pri[++tot]=i,mu[i]=-1;
            for(int j=1;j<=tot&&pri[j]*i<N;j++){
                mark[i*pri[j]]=1;
                if(i%pri[j]==0){
                    mu[i*pri[j]]=0;
                    break;
                }else mu[i*pri[j]]=-mu[i];
            }
        }
        for(int i=1;i<N;i++)F[i]=F[i-1]+mu[i];
    }
    int main(){
        init();
        scanf("%d",&T);
        while(T--){
            scanf("%d%d%d",&a,&b,&d);
            a/=d;b/=d;
            int ans=0,up=min(a,b);
            for(int i=1,j;i<=up;i=j+1){
                j=min(a/(a/i),b/(b/i));
                ans+=(F[j]-F[i-1])*(a/i)*(b/i);
            }
            printf("%d
    ",ans);
        }
        return 0;
    } 
  • 相关阅读:
    ZYNQ学习系列之GPIO
    ZYNQ7000系列学习
    新的开始
    mysql-笔记 精度
    mysql-笔记 聚合函数
    QTP自动化测试-连接数据库
    mysql create/insert
    QTP自动化测试-使用数据库-配置ODBC
    QTP自动化测试-在object repository manager中定位不到控件
    QTP自动化测试-调用函数
  • 原文地址:https://www.cnblogs.com/dream-maker-yk/p/9676387.html
Copyright © 2011-2022 走看看