BZOJ2005: [Noi2010]能量採集 莫比烏斯反演的另一種方法——nlogn篩

來源:互聯網
上載者:User

標籤:

分析: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

 

BZOJ2005: [Noi2010]能量採集 莫比烏斯反演的另一種方法——nlogn篩

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.