zoukankan      html  css  js  c++  java
  • [BZOJ 2820]YY的GCD

    [BZOJ 2820]YY的GCD

    题目

    神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种
    傻×必然不会了,于是向你来请教……多组输入

    INPUT

    第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M

    OUTPUT

    T行,每行一个整数表示第i组数据的结果

    SAMPLE

    INPUT

    2

    10 10

    100 100

    OUTPUT

    30

    2791

    解题报告

    反演首题(说好NOIP不考反演的QAQ,最近考了这么多QAQ)

    设$nleqslant m$

    $$sum_{isprime(p)} sum_{a=1}^{n} sum_{b=1}^{m}gcd(a,b)==p$$

    $$sum_{isprime(p)} sum_{a=1}^{left lfloor frac{n}{p} ight floor} sum_{b=1}^{left lfloor frac{m}{p} ight floor}gcd(a,b)==1$$

    $$sum_{isprime(p)}  sum_{a=1}^{left lfloor frac{n}{p} ight floor} sum_{b=1}^{left lfloor frac{m}{p} ight floor} sum_{dmid gcd(a,b)} mu (d)$$

    $$sum_{isprime(p)}  sum_{a=1}^{left lfloor frac{n}{p} ight floor} sum_{b=1}^{left lfloor frac{m}{p} ight floor} sum_{dmid awedge dmid b} mu (d)$$

    $$sum_{isprime(p)}sum_{d=1}^{left lfloor frac{n}{p} ight floor}mu (d)left lfloor frac{n}{pd} ight floor left lfloor frac{m}{pd} ight floor$$

    设$k=pd$

    $$sum_{k=1}^{n}sum_{isprime(p)wedge pmid k}mu (frac{k}{p})left lfloor frac{n}{k} ight floor left lfloor frac{m}{k} ight floor$$

    $$sum_{k=1}^{n}F(k)left lfloor frac{n}{k} ight floor left lfloor frac{m}{k} ight floor$$

    woc,我tm写了点啥

    然后就线性筛一下,可以GG

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 inline int read(){
     6     int sum(0);
     7     char ch(getchar());
     8     for(;ch<'0'||ch>'9';ch=getchar());
     9     for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
    10     return sum;
    11 }
    12 typedef long long L;
    13 int t,n,m;
    14 bool isnotprime[10000005];
    15 int prime[10000005],mu[10000005],num;
    16 L f[10000005];
    17 inline void play_table(){
    18     mu[1]=1;
    19     for(int i=2;i<=10000000;++i){
    20         if(!isnotprime[i]){
    21             prime[++num]=i;
    22             mu[i]=-1;
    23         }
    24         for(int j=1;j<=num&&i*prime[j]<=10000000;++j){
    25             isnotprime[i*prime[j]]=1;
    26             if(i%prime[j]==0){
    27                 mu[i*prime[j]]=0;
    28                 break;
    29             }
    30             else
    31                 mu[i*prime[j]]=-mu[i];
    32         }
    33     }
    34     for(int i=1;i<=num;++i){
    35         int p(prime[i]);
    36         for(int j=1;j*p<=10000000;++j)
    37             f[j*p]+=mu[j];
    38     }
    39     for(int i=1;i<=10000000;++i)
    40         f[i]+=f[i-1];
    41 }
    42 inline int gg(){
    43     freopen("YYnoGCD.in","r",stdin);
    44     freopen("YYnoGCD.out","w",stdout);
    45     play_table();
    46     t=read();
    47     while(t--){
    48         L ans(0);
    49         n=read(),m=read();
    50         if(n>m)
    51             swap(n,m);
    52         for(int i=1,j;i<=n;i=j+1){
    53             j=min(n/(n/i),m/(m/i));
    54             ans+=(f[j]-f[i-1])*(n/i)*(m/i);
    55         }
    56         printf("%lld
    ",ans);
    57     }
    58     return 0;
    59 }
    60 int K(gg());
    61 int main(){;}
    View Code
  • 相关阅读:
    golang中使用selenium进行爬虫
    SAS关于宏、宏函数、宏变量、data步、proc步和call execute的理解
    golang基础--slice和array
    MySQL基础操作——转
    wamp的手动安装
    SQL索引一步到位
    C语言的随机发牌程序(红桃、黑桃、梅花、方块)
    mysql数据库的导入导出
    比Android更深远的改变世界——谷歌开源人工智能系统TensorFlow文档中文版
    TensorFlow博客翻译——用TensorFlow在云端进行机器学习
  • 原文地址:https://www.cnblogs.com/hzoi-mafia/p/7635075.html
Copyright © 2011-2022 走看看