【BZOJ2818】Gcd

好玩的题目0-0

Description

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的

数对(x,y)有多少对.

Input

一个整数N

Output

如题

Sample Input

4

Sample Output

4

HINT

hint

对于样例(2,2),(2,4),(3,3),(4,2)

1≤N≤107

Source

湖北省队互测

说实话作为数论这题不算难了= =

既然我们要求的是gcd为素数的数对,

那gcd里的x,y一定是某个素数的倍数

所以枚举素数

对于每个素数prime[i]对答案的贡献一定与n/prime[i]相关

具体的数字大概是从1到n/prime[i]这些数里互质数对的数目

我们先确定数对中的y,那么对于每个y符合条件的数对的个数就是phi[y]

预处理phi前缀和pre

答案就是每一个pre[n/prime[i]]*2-1(乘2是因为原题里这些数对反过来用也算是新的,减一是减掉那个重复计算的(1,1))的和

我的pre一开始没开longlong各种奇怪WA= -=然后还经历了MAXN打成106欧拉函数都写残(忘了phi[1]=1)的悲剧我还真是够厉害能把这些错误全都犯一个遍

怪不得某Sunshine总喜欢写数论→_←

代码真短

比我的数据结构题好多了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 10000100
using namespace std;
int num;
int prime[MAXN],phi[MAXN]={0,1};
long long pre[MAXN];
bool not_prime[MAXN];
long long ans;
int n;
void prework()
{
    for (int i=2;i<=n;i++)
    {
        if (!not_prime[i])
            prime[++num]=i,phi[i]=i-1;
        for (int j=1;j<=num&&i*prime[j]<=n;j++)
        {
            not_prime[i*prime[j]]=1;
            if (i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}
int main()
{
    scanf("%d",&n);
    prework();
    for (int i=1;i<=n;i++) pre[i]=pre[i-1]+phi[i];
    for (int i=1;i<=num;i++) ans+=pre[n/prime[i]]*2-1;
    cout<<ans;
}
时间: 2024-10-29 05:06:23

【BZOJ2818】Gcd的相关文章

【BZOJ2818】Gcd 欧拉筛

Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,2) 1<=N<=10^7 Source 湖北省队互测 题解:首先我们要求Σgcd(x,y)=p (p为素数)=> Σgcd(x/p,y/p)=1 那么我们就可以枚举p,求y/p的欧拉函数的前缀和

【BZOJ2818】Gcd [莫比乌斯反演]

Gcd Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT 1<=N<=10^7 Source 直接莫比乌斯反演即可. 然后对于这个式子,我们下界分块一下即可. Code 1 #i

【BZOJ-2818】Gcd 线性筛

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3347  Solved: 1479[Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,2) 1&

【Math】GCD XOR 证明

题目:Given an integer N, and how many pairs (A;B) are there such that: gcd(A;B) = A xor B where 1<=B<=A<=N. 首先先爆一发,妥妥超时.其实真相是我想打表找规律.结果没什么规律可循. 后来分析:要想让GCD(A,B)==(A^B),A和B一定是同样的位数(二进制).因此打表方法可变为:(亦超时) void init() { int K=0; int last=0; for(int i=1;

【HDU1695】GCD(莫比乌斯反演)

[HDU1695]GCD(莫比乌斯反演) 题面 题目大意 求\(a<=x<=b,c<=y<=d\) 且\(gcd(x,y)=k\)的无序数对的个数 其中,你可以假定\(a=c=1\) 所有数都\(<=100000\) 数据组数\(<=3000\) 题解 莫比乌斯反演 作为一道莫比乌斯反演的题目 首先我们要迈出第一步 如果有\(gcd(x,y)=k\) 那么,我们就有\(gcd(\frac{x}{k},\frac{y}{k})=1\) 所以,现在问题相当于转化为了求 \(

【UVa11426】GCD - Extreme (II)(莫比乌斯反演)

[UVa11426]GCD - Extreme (II)(莫比乌斯反演) 题面 Vjudge 题解 这.. 直接套路的莫比乌斯反演 我连式子都不想写了 默认推到这里把.. 然后把\(ans\)写一下 \[ans=\sum_{d=1}^nd\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}]^2\] 令\(T=id\) 然后把\(T\)提出来 \[ans=\sum_{T=1}^n[\frac{n}{T}]^2\sum_{d|T}d\mu(\frac{T}{d})\] 后面那一堆

【BZOJ】【2818】Gcd

欧拉函数/莫比乌斯函数 嗯……跟2910很像的一道题,在上道题的基础上我们很容易就想到先求出gcd(x,y)==1的组,然后再让x*=prime[i],y*=prime[i]这样它们的最大公约数就是prime[i]了…… 当然我们完全没必要这样做……对于每个prime[j],计算在(1,n/prime[j])范围内互质的数的对数,记为f[j],那么答案就等于sigma(f[j]) f[j]的求法还是和以前一样啦~(sigma φ(i))*2+1  (加一是因为类似 5,5 这样两个质数它俩的GC

【UVA12716】GCD和XOR

题意 输入整数n(1<=n<=3*107),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b.例如:n=7时,有4对:(3,2),(5,4),(6,4),(7,6) 分析 本题的主要想法就是找到一个沟通gcd(a,b)和a^b的桥梁 a^b≥a-b.口头化证明:假如二进制位上相同,那么都是0,加入二进制位上不同,前者一定是1,后者可能是1(1-0),也有可能借位导致数位减少(0-1) a-b≥gcd(a,b).由九章算术·更相减损术可得gc

【反演复习计划】【51nod1594】Gcd and Phi

现在感觉反演好多都是套路QAQ-- #include<bits/stdc++.h> using namespace std; const int N=2e6+5; typedef long long ll; int n,cnt,prime[N],phi[N],mu[N],vis[N]; ll ans,s[N],f[N]; void calcmu(){ memset(prime,0,sizeof(prime));cnt=0; memset(phi,0,sizeof(phi));memset(mu