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

    HINT

    对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(6,3),(3,3)。

    题解

    推导:




    用莫比乌斯函数的性质把求和的式子换掉,

    其中,更换求和指标,

    容易知道单调不上升,且

    最多有种不同的取值。所以按取值分成个段分别处理,一个连续段内的和可以用预处理出的莫比乌斯函数前缀和求出

     1 #include<cstring>
     2 #include<cmath>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cstdio>
     6 
     7 #define N 50007
     8 using namespace std;
     9 inline int read()
    10 {
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    13     while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 
    17 int n,m,T;
    18 int tot,pri[N],mu[N],sum[N];
    19 bool flag[N];
    20 
    21 void init_mu()
    22 {
    23     mu[1]=1;
    24     for (int i=2;i<=50000;i++)
    25     {
    26         if (!flag[i]) pri[++tot]=i,mu[i]=-1;
    27         for (int j=1;j<=tot&&pri[j]*i<=50000;j++)
    28         {
    29             flag[pri[j]*i]=1;
    30             if (i%pri[j]==0){mu[i*pri[j]]=0;break;}
    31             else mu[i*pri[j]]=-mu[i];
    32         }
    33     }
    34     for (int i=1;i<=50000;i++)
    35         sum[i]=sum[i-1]+mu[i];
    36 }
    37 void solve(int n,int m)
    38 {
    39     int ans=0,ps;
    40     for (int i=1;i<=n;i=ps+1)
    41     {
    42         ps=min(n/(n/i),m/(m/i));
    43         ans+=(sum[ps]-sum[i-1])*(n/i)*(m/i);
    44     }
    45     printf("%d
    ",ans);
    46 }
    47 int main()
    48 {
    49     init_mu();
    50     T=read();
    51     while(T--)
    52     {
    53         int a=read(),b=read(),d=read();
    54         if (a>b) swap(a,b);
    55         solve(a/d,b/d);
    56     }
    57 }
  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8184389.html
Copyright © 2011-2022 走看看