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

    Solution

    我终于开始填反演这个无底洞了
    LaTeX用的不太好……贴一个我认为讲的挺清楚的博客吧QwQ

    Code

     1 #include<iostream>
     2 #include<cstdio>
     3 #define N (100000+1000)
     4 using namespace std;
     5 
     6 int T,a,b,d,vis[N],prime[N],sum[N],mu[N],cnt;
     7 
     8 void Get_mu()
     9 {
    10     mu[1]=1;
    11     for (int i=2; i<=50000; ++i)
    12     {
    13         if (!vis[i]){prime[++cnt]=i,mu[i]=-1;}
    14         for (int j=1; j<=cnt && prime[j]*i<=50000; ++j)
    15         {
    16             vis[prime[j]*i]=true;
    17             if (i%prime[j]==0) break;
    18             mu[prime[j]*i]=-mu[i];
    19         }
    20     }
    21     for (int i=1; i<=50000; ++i) sum[i]=sum[i-1]+mu[i];
    22 }
    23 
    24 int Calc(int n,int m)
    25 {
    26     int ans=0; if (n>m) swap(n,m);
    27     for (int l=1,r; l<=n; l=r+1)
    28     {
    29         r=min(n/(n/l),m/(m/l));
    30         ans+=(sum[r]-sum[l-1])*(n/l)*(m/l);
    31     }
    32     return ans;
    33 }
    34 
    35 int main()
    36 {
    37     scanf("%d",&T);
    38     Get_mu();
    39     while (T--)
    40     {
    41         scanf("%d%d%d",&a,&b,&d);
    42         printf("%d
    ",Calc(a/d,b/d));
    43     }
    44 }
  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/refun/p/9553969.html
Copyright © 2011-2022 走看看