P6860-象棋与马【欧拉函数,杜教筛】
出題人來報個到
正題
題目鏈接:https://www.luogu.com.cn/problem/P6860
題目大意
p(a,b)=1p(a,b)=1p(a,b)=1當且經(jīng)當一只走a?ba*ba?b矩形的馬可以走到棋盤上任何一個點
求∑a=1n∑b=1np(a,b)\sum_{a=1}^n\sum_{b=1}^np(a,b)a=1∑n?b=1∑n?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)=0且2(cy?dx)=12(cy-dx)=12(cy?dx)=1。因為x,yx,yx,y互質(zhì)顯然(ax?by)(ax-by)(ax?by)和(cy?dx)(cy-dx)(cy?dx)都可以表示成任意整數(shù)。所有就有2k=02k=02k=0且2k=12k=12k=1,顯然無解。
同理第二個可以推出2k+x=02k+x=02k+x=0且2k+y=12k+y=12k+y=1,就是xxx是偶數(shù),yyy是奇數(shù)
第三個推出2k?y=02k-y=02k?y=0且2k?x=12k-x=12k?x=1,就是xxx是奇數(shù),yyy是偶數(shù)
第四個是2k+x?y=02k+x-y=02k+x?y=0且2k+y?x=12k+y-x=12k+y?x=1,顯然無解
也就是如果x+yx+yx+y是奇數(shù),且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 x1~x中與它互質(zhì)且不是同奇偶的數(shù)的個數(shù)。若xxx是一個偶數(shù),那么顯然沒有偶數(shù)和它互質(zhì)那么有w(x)=φ(x)w(x)=\varphi(x)w(x)=φ(x),若xxx是奇數(shù),那么對于每個偶數(shù)yyy和它互質(zhì)也一定有一個對應的奇數(shù)x?yx-yx?y和它互質(zhì),那么有w(x)=φ(x)2w(x)=\frac{\varphi(x)}{2}w(x)=2φ(x)?。然后求和可以計算答案,時間復雜度O(n)O(n)O(n)
考慮如何用杜教篩優(yōu)化,我們可以將問題轉換為分開求奇數(shù)和偶數(shù)的φ\varphiφ和,對于每個偶數(shù)一定可以被表示為2k(k≤n2)2k(k\leq \frac{n}{2})2k(k≤2n?),那么如何kkk是偶數(shù)就有φ(2k)=φ(k)\varphi(2k)=\varphi(k)φ(2k)=φ(k),如果kkk是奇數(shù)就有φ(2k)=2?φ(k)\varphi(2k)=2*\varphi(k)φ(2k)=2?φ(k),也就是如果求出1~n21\sim \frac{n}{2}1~2n?的奇偶的φ\varphiφ和就可以求出偶數(shù)的φ\varphiφ和,然后杜教篩減去求出奇數(shù)的,這是一個分治的過程,可以通過本題。
時間復雜度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-象棋与马【欧拉函数,杜教筛】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怪不得电脑硬件配置不对劲电脑配置不对怎么
- 下一篇: Win10电脑慢怎么解决电脑慢如何清理