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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P6860-象棋与马【欧拉函数,杜教筛】

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P6860-象棋与马【欧拉函数,杜教筛】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

出題人來報個到

正題

題目鏈接:https://www.luogu.com.cn/problem/P6860


題目大意

p(a,b)=1p(a,b)=1p(a,b)=1當且經當一只走a?ba*ba?b矩形的馬可以走到棋盤上任何一個點
∑a=1n∑b=1np(a,b)\sum_{a=1}^n\sum_{b=1}^np(a,b)a=1n?b=1n?p(a,b)


解題思路

這個馬能走到全圖的充要條件顯然是它能走到(0,1)(0,1)(0,1)。考慮給出(a,b)(a,b)(a,b)求它能否走到(0,1)(0,1)(0,1)

首先如果gcd(x,y)≠1gcd(x,y)\neq 1gcd(x,y)?=1顯然不行

因為走的順序無所謂將走的路程分成兩段,一段是(x±a,y±b)(x\pm a,y\pm b)(x±a,y±b),一段是(x±b,y±b)(x\pm b,y\pm b)(x±b,y±b)

顯然對于第一段能走到的點可以表示為(2ax,2ay)(2ax,2ay)(2ax,2ay)(2ax+x,2ay+y)(2ax+x,2ay+y)(2ax+x,2ay+y)。第二段同理。

{2ax=2by2cy=2dx+1\left\{\begin{matrix} 2ax=2by \\ 2cy=2dx+1 \end{matrix}\right.{2ax=2by2cy=2dx+1?

{2ax+x=2by2cy+y=2dx+1\left\{\begin{matrix} 2ax+x=2by \\ 2cy+y=2dx+1 \end{matrix}\right.{2ax+x=2by2cy+y=2dx+1?

{2ax=2by+y2cy=2dx+x+1\left\{\begin{matrix} 2ax=2by+y \\ 2cy=2dx+x+1 \end{matrix}\right.{2ax=2by+y2cy=2dx+x+1?

{2ax+x=2by+y2cy+y=2dx+x+1\left\{\begin{matrix} 2ax+x=2by+y \\ 2cy+y=2dx+x+1 \end{matrix}\right.{2ax+x=2by+y2cy+y=2dx+x+1?

第一個我們有2(ax?by)=02(ax-by)=02(ax?by)=02(cy?dx)=12(cy-dx)=12(cy?dx)=1。因為x,yx,yx,y互質顯然(ax?by)(ax-by)(ax?by)(cy?dx)(cy-dx)(cy?dx)都可以表示成任意整數。所有就有2k=02k=02k=02k=12k=12k=1,顯然無解。

同理第二個可以推出2k+x=02k+x=02k+x=02k+y=12k+y=12k+y=1,就是xxx是偶數,yyy是奇數

第三個推出2k?y=02k-y=02k?y=02k?x=12k-x=12k?x=1,就是xxx是奇數,yyy是偶數

第四個是2k+x?y=02k+x-y=02k+x?y=02k+y?x=12k+y-x=12k+y?x=1,顯然無解

也就是如果x+yx+yx+y是奇數,且gcd(x,y)=1gcd(x,y)=1gcd(x,y)=1那么有p(x,y)=1p(x,y)=1p(x,y)=1,直接可以計算答案,時間復雜度O(n2)O(n^2)O(n2)

定義w(x)w(x)w(x)表示1~x1\sim x1x中與它互質且不是同奇偶的數的個數。若xxx是一個偶數,那么顯然沒有偶數和它互質那么有w(x)=φ(x)w(x)=\varphi(x)w(x)=φ(x),若xxx是奇數,那么對于每個偶數yyy和它互質也一定有一個對應的奇數x?yx-yx?y和它互質,那么有w(x)=φ(x)2w(x)=\frac{\varphi(x)}{2}w(x)=2φ(x)?。然后求和可以計算答案,時間復雜度O(n)O(n)O(n)

考慮如何用杜教篩優化,我們可以將問題轉換為分開求奇數和偶數的φ\varphiφ和,對于每個偶數一定可以被表示為2k(k≤n2)2k(k\leq \frac{n}{2})2k(k2n?),那么如何kkk是偶數就有φ(2k)=φ(k)\varphi(2k)=\varphi(k)φ(2k)=φ(k),如果kkk是奇數就有φ(2k)=2?φ(k)\varphi(2k)=2*\varphi(k)φ(2k)=2?φ(k),也就是如果求出1~n21\sim \frac{n}{2}12n?的奇偶的φ\varphiφ和就可以求出偶數的φ\varphiφ和,然后杜教篩減去求出奇數的,這是一個分治的過程,可以通過本題。

時間復雜度O(n23log?n)O(n^{\frac{2}{3}}\log n)O(n32?logn)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll unsigned long long using namespace std; const ll N=1e7+1; ll T,n,cnt,mu[N],phi[N],pri[N]; ll sp1[N],sp2[N],p1[1100],p2[1100]; bool vis[N]; map<ll,ll> sp,sm; void prime(){phi[1]=1;for(ll i=2;i<N;i++){if(!vis[i])pri[++cnt]=i,phi[i]=i-1;for(ll j=1;j<=cnt&&pri[j]*i<N;j++){vis[pri[j]*i]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[pri[j]]*phi[i];}}for(ll i=1;i<N;i++){sp1[i]=sp1[i-1]+phi[i]*(i&1);sp2[i]=sp2[i-1]+phi[i]*(!(i&1));}return; } ll GetSphi(ll n){if(n<N)return sp1[n]+sp2[n];if(sp[n])return sp[n];ll rest=(n%2ull==0ull)?((ll)n/2ull*(n+1ull)):((ll)(n+1ull)/2ull*n);for(ll l=2ull,r;l<=n;l=r+1ull)r=n/(n/l),rest-=(r-l+1ull)*GetSphi(n/l);return (sp[n]=rest); } void dfs(ll x,ll n){p1[x]=p2[x]=0;if(n<N){p1[x]=sp1[n];p2[x]=sp2[n];return;}dfs(x+1,n/2);p2[x]+=p1[x+1]+p2[x+1]*2ull; p1[x]+=GetSphi(n)-p2[x];return; } int main() {prime();scanf("%llu",&T);while(T--){scanf("%llu",&n);dfs(0,n);printf("%llu\n",p1[0]+p2[0]*2ull-1ull);} }

總結

以上是生活随笔為你收集整理的P6860-象棋与马【欧拉函数,杜教筛】的全部內容,希望文章能夠幫你解決所遇到的問題。

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