【数论】GCD(P2568)
正題
P2568
題目大意
求滿足1≤x,y≤n1\leq x,y\leq n1≤x,y≤n且gcd(x,y)=primegcd(x,y)=primegcd(x,y)=prime的數對(x,y)(x,y)(x,y)的個數
解題思路
題目即求
∑i=1n∑j=1n[gcd(i,j)=prime]\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=prime]i=1∑n?j=1∑n?[gcd(i,j)=prime]
可以考慮先枚舉該prime,那么有
∑p∈primen∑i=1n/p∑j=1n/p[gcd(i,j)=1]∑p∈primen∑i=1n/p∑j=1n/p∑d∣i,d∣jμ(d)∑p∈primen∑d=1n/pμ(d)×?nd?×?nd?\sum_{p\in prime}^n\sum_{i=1}^{n/p}\sum_{j=1}^{n/p}[gcd(i,j)=1]\\ \sum_{p\in prime}^n\sum_{i=1}^{n/p}\sum_{j=1}^{n/p}\sum_{d|i,d|j}\mu(d)\\ \sum_{p\in prime}^n\sum_{d=1}^{n/p}\mu(d)\times \left\lfloor\frac{n}ze8trgl8bvbq\right\rfloor\times \left\lfloor\frac{n}ze8trgl8bvbq\right\rfloor p∈prime∑n?i=1∑n/p?j=1∑n/p?[gcd(i,j)=1]p∈prime∑n?i=1∑n/p?j=1∑n/p?d∣i,d∣j∑?μ(d)p∈prime∑n?d=1∑n/p?μ(d)×?dn??×?dn??
時間復雜度不太會證,看dalao證的是 O(n/logn)O(n/log n)O(n/logn)的
code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 10000010 using namespace std; ll n,ans,w,p[N],mu[N],prime[N]; void work() {p[1]=mu[1]=1;for(ll i=2;i<=10000000;++i){if(!p[i]){prime[++w]=i;mu[i]=-1;}for(ll j=1;j<=w&&i*prime[j]<=10000000;++j){p[i*prime[j]]=1;if(i%prime[j]==0){mu[i*prime[j]]=0;break;}else mu[i*prime[j]]=-mu[i];}}for(ll i=2;i<=10000000;++i)mu[i]+=mu[i-1];return; } ll get(ll n) {ll sum=0;for(ll l=1,r=0;l<=n;l=r+1){r=n/(n/l);sum+=(mu[r]-mu[l-1])*(n/l)*(n/l);}return sum; } int main() {scanf("%lld",&n);work();for(ll i=1;i<=w;++i)if(prime[i]<=n)ans+=get(n/prime[i]);else break;printf("%lld",ans);return 0; }總結
以上是生活随笔為你收集整理的【数论】GCD(P2568)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数论】ZAP-Queries(P345
- 下一篇: 2014主流的电脑配置在哪里(2014主