BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛
生活随笔
收集整理的這篇文章主要介紹了
BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分析:http://www.cnblogs.com/huhuuu/archive/2011/11/25/2263803.html
注:從這個題收獲了兩點
???? 1,第一象限(x,y)到(0,0)的線段上整點的個數是gcd(x,y)
???? 2,新學了一發求gcd(x,y)=k有多少對的姿勢,已知0<x<=n,0<y<=m
???? 令x=min(n,m),令f[i]代表gcd(x,y)=i的對數,
???? 那么通過O(xlogx)的復雜度就可以得到f[1]到f[n](反著循環)
??? 普通的容斥(即莫比烏斯反演)其實也是O(xlogx)的,只是需要篩一遍莫比烏斯函數
總結:對于求單個的gcd(x,y)=k的對數,可以用莫比烏斯反演來做,這樣的復雜度是O(n/k)的
?????????對于求gcd(x,y)=(1,..n)的對數,每個分別求解時,直接用這樣的O(nlogn)的篩法就好,省代碼,還好寫
#include<cstdio> #include<cstring> #include<queue> #include<cstdlib> #include<algorithm> #include<vector> #include<cmath> using namespace std; typedef long long LL; const int N=1e5+5; const int INF=0x3f3f3f3f; LL f[N]; int main(){LL n,m,ans=0;scanf("%lld%lld",&n,&m);if(n>m)swap(n,m);for(int i=n;i>=1;--i){f[i]=n/i*(m/i);for(int j=i+i;j<=n;j+=i)f[i]-=f[j];ans+=f[i]*(2*i-1); }printf("%lld\n",ans);return 0; } View Code?
轉載于:https://www.cnblogs.com/shuguangzw/p/5440297.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript中this
- 下一篇: 第二章 读书笔记