zoukankan      html  css  js  c++  java
  • 1101: [POI2007]Zap

    1101: [POI2007]Zap

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2904  Solved: 1267
    [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
    //对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(
    6,3),(3,3)。

    题解

    首先:
    令 $f(n) = [(i,j)=n],F(n) = n|(i,j)$

    那么 $F(n) = sumlimits_{d|n}f(d)$

    反演后得到 $f(n) = sumlimits_{n|d}μ(frac{d}{n})F(d)$

    题目要求

    $sumlimits_{i=1}^nsumlimits_{j=1}^m [(i,j)=k]$

    $sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor} [(i,j)=1]$

    反演后得到 $f(1) =sumlimits_{d=1}^{min(lfloorfrac{n}{k} floor,lfloorfrac{m}{k} floor)}μ(d)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor$

    对莫比乌斯函数维护一个前缀和。
    对$lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor分块$

    参考popoqqq的课件。

    看到黄学长的另一种方法http://hzwer.com/4205.html

    code

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 
     7 const int N = 50000;
     8 typedef long long LL;
     9 
    10 int prime[N+10],mu[N+10],sum[N];
    11 bool noprime[N+10];
    12 int tot;
    13 
    14 void getmu() {
    15     mu[1] = 1;
    16     for (int i=2; i<=N; ++i) {
    17         if (!noprime[i]) prime[++tot] = i,mu[i] = -1;
    18         for (int j=1; j<=tot&&i*prime[j]<=N; ++j) {
    19             noprime[i * prime[j]] = true;
    20             if (i % prime[j]==0) {mu[i * prime[j]] = 0;break;}
    21             mu[i * prime[j]] = -mu[i];
    22         }
    23     }
    24     for (int i=1; i<=N; ++i) sum[i] = sum[i-1] + mu[i];
    25 }
    26 
    27 int main () {
    28     getmu();
    29     int T,n,m,c,k,p;
    30     scanf("%d",&T);
    31     while (T--) {
    32         scanf("%d%d%d",&n,&m,&k) ;
    33         n /= k;m /= k;
    34         c = min(n,m);
    35         LL ans = 0;
    36         for (int d=1; d<=c; d=p+1) {
    37             p = min(n/(n/d),m/(m/d));
    38             ans += 1ll*(sum[p]-sum[d-1])*(n/d)*(m/d);
    39         }        
    40         printf("%lld
    ",ans);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8413495.html
Copyright © 2011-2022 走看看