日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2005 NOI2010 能量采集 欧拉函数

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2005 NOI2010 能量采集 欧拉函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:求$\sum\limits_{i = 1}^N {\sum\limits_{j = 1}^M {f(i,j)} } $,其中f(i,j)=(0,0)與(i,j)連線上點的數量

題解:

如果一個點(x',y')在(0,0)與(x,y)的連線上,則有gcd(x',y')==gcd(x,y)。因此f(i,j)=(gcd(i',j')=gcd(i,j))且i'<i,j'<j的點的數量。

由于題目中不需要統計(x,y)本身,所以計算出的2*ans=ANS+N*M=>ANS=2*ans-N*M。
現在我們來看如何求ans,我們枚舉倍數i,則滿足x%i==0 && y%i==0的點(x,y)的數量就有(N/i)*(M/i)個,而對于每個這樣的點,其與(0,0)連線上的點就有phi(i)個,因此
ans=sum(phi(i)*(N/i)*(M/i))
然后用分塊就可以將復雜度降為sqrt(N)

#include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define ll long longconst int MAXN=100000+2; ll N,M,ans; ll f[MAXN]; ll phi[MAXN],prime[MAXN]; bool flag[MAXN];int main(){cin >> N >> M;if(M>N) swap(N,M);phi[1]=1;for(int i=2,k=0;i<=n;i++){if(!flag[i]) prime[++k]=i,phi[i]=i-1;for(int j=1;j<=k && prime[j]*i<=n;j++){flag[i*prime[j]]=1;if(!(i%prime[j])){phi[i*prime[j]]=phi[i]*prime[j];break;}phi[i*prime[j]]=phi[i]*(prime[j]-1);}}for(int i=2;i<=M;i++) phi[i]+=phi[i-1];for(int i=1,j;i<=M;i=j+1){j=min(N/(N/i),M/(M/i));ans+=(phi[j]-phi[i-1])*(N/i)*(M/i);}cout << 2*ans-N*M << endl;return 0; } View Code

?

轉載于:https://www.cnblogs.com/WDZRMPCBIT/p/6444703.html

總結

以上是生活随笔為你收集整理的BZOJ2005 NOI2010 能量采集 欧拉函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。