专题练习---(数论)莫比乌斯反演

            GCD

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7026    Accepted Submission(s):
2584

Problem Description

Given 5 integers: a, b, c, d, k, you‘re to find x in
a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common
divisor of x and y. Since the number of choices may be very large, you‘re only
required to output the total number of different number pairs.
Please notice
that, (x=5, y=7) and (x=7, y=5) are considered to be the same.

Yoiu
can assume that a = c = 1 in all test cases.

Input

The input consists of several test cases. The first
line of the input is the number of the cases. There are no more than 3,000
cases.
Each case contains five integers: a, b, c, d, k, 0 < a <= b
<= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as
described above.

Output

For each test case, print the number of choices. Use
the format in the example.

Sample Input

2
1 3 1 5 1
1 11014 1 14409 9

Sample Output

Case 1: 9
Case 2: 736427

Hint

For the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).

Source

2008
“Sunline Cup” National Invitational Contest

题意:  给出a,b,c,d,k, 使得  a<=x<=b , c<=y<=d  &&gcd(x,y)=k的数对(x,y)的对数。

  限制:  a=c=1 ,  0<b,c<=100000 ;(n1,n2)和(n2 ,n1)算为同一种情况、

做这道题之前 ,先来了解一下,莫比乌斯函数:

百度百科---莫比乌斯反演函数

知道,莫比乌斯函数,求其反演函数.....具体可以见上面的地址

对于这道题,我们可以这样分析:

1  设f(k)为gcd(x,y)=k的数对(x,y)的对数,我们要求的是f(1)
2 设F(k)为gcd(x,y)为k的倍数的数对(x,y)的对数,可以想到F(k)=floor(b/k)*floor(d/k),   F(k)=E[b/k]*[d/k]*mu[k];

3 由莫比乌斯反演得:
4 令lim=min(b/k,d/k)
5 f(1)=mu[1]*F(1) + mu[2]*F[2] + ... + mu[lim]*F(lim)
6 因为(n1,n2)和(n2,n1)算为同一种情况,所以最后结果还要减掉重复的情况。

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #define _llint long long
 7 using namespace std;
 8 const int maxn=100010;
 9 bool jud[maxn];
10 int mu[maxn] , prime[maxn];
11
12 void Mobius(){
13   int cnt=0;
14   memset(jud , 0 , sizeof jud);
15   mu[1]=1;   //d=1
16   for(int i=2 ; i<maxn ;i++){
17
18       if(!jud[i]){
19           mu[i]=-mu[1];  //1*p
20           prime[cnt++]=i;
21       }
22     for(int j=0 ; j<cnt&&i*prime[j]<maxn ; j++ ){
23
24         jud[i*prime[j]]=1;
25         if(i%prime[j]==0){
26             mu[i*prime[j]]=0 ; //²»ÊÇ»¥ÒìµÄËØÊý
27             break;
28         }else{
29              mu[i*prime[j]]=  -1*mu[i];
30         }
31     }
32   }
33   return ;
34 }
35
36 _llint solve(int n, int m){
37
38    _llint res=0;
39    for(int i=1; i<=n ;i++){
40      res+=(_llint)(m/i)*(n/i)*mu[i];
41    }
42    return res;
43 }
44
45 int main()
46 {
47   int T,a,b,c,d,k;
48   Mobius();
49   scanf("%d",&T);
50   for(int i=1 ;i<=T ;i++){
51     scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
52     if(0==k)
53     {
54         printf("Case %d: 0\n",i);
55         continue;
56     }
57      b/=k  , d/=k;
58      if(b>d)    swap( b , d );
59     _llint ans1=solve(b,d);
60     _llint ans2=solve(b,b);
61      printf("Case %d: %lld\n",i,ans1-ans2/2);
62   }
63  return 0;
64 }
时间: 2024-10-18 07:07:39

专题练习---(数论)莫比乌斯反演的相关文章

【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 其中f(ij)表示ij的约数个数. 他发现答案有点大,只需要输出模1000000007的值. 输入 第一行一个整数n. 输出 一行一个整数ans,表示答案模1000000007的值. 样例输入 2 样例输出 8 题解 莫比乌斯反演+杜教筛 首先有个神奇

【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll mod = 1000000007; ll a[110][110] , p[1010] , v[1010]; ll pow(ll x , ll

[SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演

7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many lattice points are visible from corner at (0,0,0) ? A point X is visible from point Y iff no other lat

学习笔记--数论--莫比乌斯反演初认识

前言 本文只是用比较通俗的例子让大家了解一下什么是莫比乌斯反演,其中说明 (明明都是瞎猜)可能有纰漏.本人也是个蒟蒻,未能给出珂学证明,还望多多指教. 理论基础 "|"符号表示整除, a|b 表示b被a整除,也就是b有a这个因数,b=ka (k∈N). "∑ "求和符号 是什么 请先看这个例子: 假设有两个函数F(n),f(d),且d∈{x| x|n(即n被d整除)} 并有以下关系:F(n)等于所有f(d)之和. 比如:6能被1,2,3,6整除,所以F(6)=f(1

[bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]

题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^n\sum_{j|i,j|n}\mu(j)i^d=\sum_{j|n}\mu(j)\sum_{i=1}^{\frac{n}{j}}(ij)^d=\sum_{j|n}\mu(j)j^d\sum_{i=1}^{\frac{n}{j}}i^d$ 那么最后面这个东西就是个自然数幂求和了 在这篇关于斯特林数的

组合 数论 莫比乌斯反演 hdu1695

题解:https://blog.csdn.net/lixuepeng_001/article/details/50577932 题意:给定范围1-b和1-d求(i,j)=k的数对的数量 #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #include<cstring> using namespace std; const int MAXN = 100000

模板 - 数学 - 数论 - 莫比乌斯反演 - 2

示例: 1.经典问题 求 $f(x,n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==x]$ : 答案: $f(x,n,m) = \sum\limits_{k=1}\mu(k){\lfloor{\frac{n}{kx}}}\rfloor{\lfloor{\frac{m}{kx}}\rfloor}$ 构造: $F(x,n,m) = \sum\limits_{x|d}f(d) = \sum\limits_{k=1}f(kx) =\su

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s

BZOJ 4176 Lucas的数论 莫比乌斯反演

题目大意:给定n(n≤109),求∑ni=1∑nj=1d(ij) 推错式子害死人... 由d|ij等价于dgcd(i,d)|j可得 ∑ni=1∑nj=1d(ij) =∑ni=1∑n2d=1?n?gcd(i,d)d? =∑nd=1∑?nd?i=1∑?n2d?j=1?nj?[gcd(i,j)=1] =∑nd=1∑?nd?i=1∑nj=1?nj?[gcd(i,j)=1] =∑nd=1∑?nd?i=1∑nj=1?nj?∑k|i,k|jμ(k) =∑nk=1μ(k)(∑?nk?d=1?nkd?)2 O(n

BZOJ 3601 一个人的数论 莫比乌斯反演+高斯消元

题目大意:求Σ[i|n]i^d 围观题解:http://www.cnblogs.com/jianglangcaijin/p/4033399.html 果然我还是太蒻了- - 此外Σ[1<=i<=n]i^m的零次项注定为0- - 所以常数项不用消了- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 #defin