zoukankan      html  css  js  c++  java
  • bzoj 2820 YY的GCD 莫比乌斯反演

     题目大意:

    给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对

    这里就抄一下别人的推断过程了

    后面这个g(x) 算的方法就是在线性筛的时候只考虑当前的数最小因子,如果进来的最小因子不存在,相当于在之前那个数的基础上的每个mu值都多加了一个质数,那么

    这些mu值就要取反,如果已经包含了这个最小因子,我这里另外进行了跟之前类似的讨论方法,在代码中写着

    因为这题目数据比较大,这里求解的时候不应该线性求,因为总是有一段区间的n/i*(m/i)值相同,将g[]数组求一个前缀和,记录一段区间得到的值,可以缩小到

    sqrt(n)的复杂度

     1 /*bzoj2820 YY的GCD*/
     2 #include <bits/stdc++.h>
     3 
     4 using namespace std;
     5 #define ll long long
     6 #define N 10000000
     7 int mu[N+5] , prime[N+5] , tot , f[N+5] , sum[N+5];
     8 bool check[N+5];
     9 
    10 void get_mu()
    11 {
    12     mu[1] = 1;
    13     for(int i=2 ; i<=N ; i++){
    14         if(!check[i]){
    15             prime[tot++] = i;
    16             mu[i] = -1;
    17             f[i] = 1;
    18         }
    19         for(int j=0 ; j<tot ; j++){
    20             if((ll)prime[j]*i>N) break;
    21             check[prime[j]*i] = true;
    22             if(i%prime[j]){
    23                 mu[i*prime[j]] = -mu[i];
    24                 f[i*prime[j]] = -f[i]+mu[i];
    25             }else{
    26                 /*
    27                 本身i中已经含有素数prime[j]
    28                 在if中表示含有至少3个因子prime[j],那么最后不管怎么样,当前数值除以一个因子都至少
    29                 含有两个prime[j],那么必然为0
    30                 else 只有2个prime[j]的情况,那么就是除了除以prime[j]其他情况得到的都是至少有两个因子
    31                 的,那么mu[]必然为0,而因为从当前增加了一个因子,那么就是讲那个取到的取反就可以了
    32                 */
    33                 if((i/prime[j])%prime[j]==0) f[i*prime[j]] = mu[i];
    34                 else f[i*prime[j]] = -mu[i/prime[j]];
    35                 break;
    36             }
    37         }
    38     }
    39     for(int i=1 ; i<=N ; i++) sum[i] = sum[i-1]+f[i];
    40 }
    41 int n , m;
    42 
    43 ll solve()
    44 {
    45     int mn = min(n , m) , last ;
    46     ll ret=0;
    47     for(int i=1 ; i<=mn ; i=last+1){
    48         last = min(n/(n/i) , m/(m/i));
    49         ret += (ll)(sum[last]-sum[i-1])*(n/i)*(m/i);
    50     }
    51     return ret;
    52 }
    53 
    54 int main()
    55 {
    56     freopen("in.txt" , "r" , stdin);
    57     get_mu();
    58     int T;
    59     scanf("%d" , &T);
    60     while(T--){
    61         scanf("%d%d" , &n , &m);
    62         printf("%lld
    " , solve());
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    测试markdown
    Ubuntu 部署 k8s集群
    HTML 表格 各标签使用的标准顺序(心得)
    javascript event(事件对象)详解
    CSS3选择器归类整理
    PHP开发中session无法获取和保存问题解决方法
    表单脚本
    PHP页面跳转三种实现方法
    PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理
    JS前端将table导出到excel 兼容谷歌 IE 且保留表格样式
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4787151.html
Copyright © 2011-2022 走看看