• 【BZOJ】【1101】【POI2007】Zap


    莫比乌斯反演

      PoPoQQQ的讲义例一的一半……好吧这题是那题的基础部分= =很水……

    WA了一次:因为没强制类型转换LL

     1 /**************************************************************
     2     Problem: 1101
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:6896 ms
     7     Memory:1908 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 1101
    11 #include<cstdio>
    12 #include<cstdlib>
    13 #include<cstring>
    14 #include<iostream>
    15 #include<algorithm>
    16 #define rep(i,n) for(int i=0;i<n;++i)
    17 #define F(i,j,n) for(int i=j;i<=n;++i)
    18 #define D(i,j,n) for(int i=j;i>=n;--i)
    19 using namespace std;
    20  
    21 int getint(){
    22     int v=0,sign=1; char ch=getchar();
    23     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
    24     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
    25     return v*=sign;
    26 }
    27 /*******************tamplate********************/
    28 const int N=50010;
    29 typedef long long LL;
    30 int prime[N],mu[N],sum[N];
    31 bool check[N];
    32 void getmu(){
    33     mu[1]=1;
    34     int tot=0;
    35     for(int i=2;i<N;++i){
    36         if (!check[i]){
    37             prime[tot++]=i;
    38             mu[i]=-1;
    39         }
    40         rep(j,tot){
    41             if (i*prime[j]>N) break;
    42             check[i*prime[j]]=1;
    43             if (i%prime[j])
    44                 mu[i*prime[j]]=-mu[i];
    45             else{
    46                 mu[i*prime[j]]=0;
    47                 break;
    48             }
    49         }
    50     }
    51     F(i,1,N-1) sum[i]=sum[i-1]+mu[i];
    52 }
    53 LL calc(int m,int n,int k){
    54     int i,last;
    55     LL re=0;
    56     n/=k; m/=k;
    57     for(i=1;i<=m && i<=n;i=last+1){
    58         last=min(n/(n/i),m/(m/i));
    59         re+=(LL)(sum[last]-sum[i-1])*(m/i)*(n/i);
    60     }
    61     return re;
    62 }
    63 int main(){
    64     int n=getint(),a,b,d;
    65     getmu();
    66     F(i,1,n){
    67         a=getint(); b=getint(); d=getint();
    68         printf("%lld
    ",calc(a,b,d));
    69     }
    70     return 0;
    71 }
    View Code

    1101: [POI2007]Zap

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1559  Solved: 534
    [Submit][Status][Discuss]

    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)。

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    http响应状态码大全
    Internet protocol security (ipsec) packet processing for multiple clients sharing a single network address
    linq.js的用法
    linq.js的用法
    程序员每天应该思考的5个问题,你有思考过吗?
    程序员每天应该思考的5个问题,你有思考过吗?
    程序员每天应该思考的5个问题,你有思考过吗?
    Win10 owerShell Get命令大全
    Win10 owerShell Get命令大全
    Win10 owerShell Get命令大全
  • 原文地址:https://www.cnblogs.com/Tunix/p/4294371.html
Copyright © 2020-2023  润新知