1. 程式人生 > 實用技巧 >題解 P1587 【[NOI2016]迴圈之美】

題解 P1587 【[NOI2016]迴圈之美】

題意

求滿足 \(1 \leq x \leq n,1 \leq y \leq m\) 的在 \(k\) 進位制下能寫成純迴圈小數的最簡分數 \(\frac{x}{y}\) 的個數。

題解


證明:

\[\text{Ans}=\sum_{x=1}^{n}\sum_{y=1}^{m}[x \bot y][y \bot k] \]

首先要知道, \(k\) 進位制下 \(\frac{x}{y}\) 小數點右移一位等於 \(\frac{x}{y} \times k\)

假設 \(\frac{x}{y}\) 小數部分的迴圈節長度為 \(l\) ,由於純迴圈小數的特殊性質有:

\[[\frac{xk^l}{y}]=[\frac{x}{y}] \]

這裡的方括號代表取小數部分。

那麼有:

\[\frac{xk^l}{y}-\lfloor\frac{xk^l}{y}\rfloor=\frac{x}{y}-\lfloor\frac{x}{y}\rfloor \]

注意這裡是下取整。

兩邊同時乘上 \(y\)

\[xk^l-\lfloor\frac{xk^l}{y}\rfloor\times y=x-\lfloor\frac{x}{y}\rfloor\times y \]

變化成同餘式:

\[xk^l \equiv x \ ({\rm{mod}} \ y) \]

因為 \(x \bot y\) ,則有:

\[k^l \equiv k \equiv 1 \ ({\rm{mod}} \ y) \implies y \bot k \]

那麼分數 \(\frac{x}{y}\) 當且僅當 \(x \bot y,y \bot k\) 才會對 \(\text{Ans}\) 產生貢獻。

證畢。


接下來就開始推式子。

將式子中 \([x \bot y]\) 用莫比烏斯函式替換:

\[\begin{align} \sum_{x=1}^{n}\sum_{y=1}^{m}[x \bot y][y \bot k] & = \sum_{x=1}^{n}\sum_{y=1}^{m}[y \bot k]\sum_{d|x,d|y} \mu(d)\\ &=\sum_{d=1}^{{\rm{min}}(n,m)}\mu(d) \lfloor\frac{n}{d}\rfloor\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor} [yd \bot k]=\sum_{d=1}^{{\rm{min}}(n,m)}\mu(d) \lfloor\frac{n}{d}\rfloor\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor} [y \bot k][d \bot k]\\ &=\sum_{d=1}^{{\rm{min}}(n,m)}\mu(d)[d \bot k] \lfloor\frac{n}{d}\rfloor\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor} [y \bot k] \end{align} \]

如果我們能快速求出 \(\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor} [y \bot k]\)\(\mu(d)[d \bot k]\) 的字首和,那麼用整除分塊就容易得到 \(\text{Ans}\)

首先不難看出 \(k\) 中多個相同的質因子對 \(k\) 與其他數是否互質沒有影響,所以不妨假設 \(k\) 的所有質因子次數均為1。

令:

\[f(n,k)=\sum_{i=1}^n[i \bot k]\\ g(n,k)=\sum_{i=1}^n\mu(i)[i \bot k] \]

那麼 \(f(n,1)=\sum_{i=1}^n1=n\) 能直接得出, \(g(n,1)=\sum_{i=1}^n\mu(i)\) 能通過杜教篩得出。

考慮 \(k \not = 1\) 的情況:

對於 \(k\) 的一個質因子 \(p\) ,考慮 \(f(n,k)\) 如何由 \(f(n,\frac{k}{p})\) 得來。

由於多了一個質因子,則與 \(\frac{k}{p}\) 互質的數中有一些不與 \(k\) 互質,即能被 \(p\) 整除的數。所以\(f(n,k)\) 要從 \(f(n,\frac{k}{p})\) 中去掉一部分:

\[\begin{align} f(n,k)&=\sum_{i=1}^{n}[i \bot k]=\sum_{i=1}^n[i \bot \frac{k}{p}]-\sum_{i=1}^n[i\bot \frac{k}{p}][p|i]\\ &=f(n,\frac{k}{p})-\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}[ip\bot \frac{k}{p}] \end{align} \]

因為 \(p\) 不存在於 \(\frac{k}{p}\) 中,則有 \([ip \bot \frac{k}{p}]=[i \bot \frac{k}{p}]\) ,則:

\[f(n,k)=f(n,\frac{k}{p})-\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}[i\bot \frac{k}{p}]=f(n,\frac{k}{p})-f(\lfloor\frac{n}{p}\rfloor,\frac{k}{p}) \]

類似的,有:

\[\begin{align} g(n,k)&=\sum_{i=1}^n\mu(i)[i\bot k]=\sum_{i=1}^n\mu(i)[i\bot \frac{k}{p}]-\sum_{i=1}^n\mu(i)[i\bot \frac{k}{p}][p|i]\\ &=g(n,\frac{k}{p})-\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\mu(ip)[i\bot \frac{k}{p}] \end{align} \]

對於莫比烏斯函式,有:

\[\mu(ij)=\mu(i)\mu(j)[i\bot j] \]

代入上式得:

\[\begin{align} g(n,k)&=g(n,\frac{k}{p})-\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\mu(ip)[i\bot \frac{k}{p}]\\ &=g(n,\frac{k}{p})-\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\mu(i)\mu(p)[i\bot p][i\bot \frac{k}{p}]\\ &=g(n,\frac{k}{p})+\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\mu(i)[i\bot k]\\ &=g(n,\frac{k}{p})+g(\lfloor\frac{n}{p}\rfloor,k) \end{align} \]

遞迴求一下 \(f,g\) ,這道題就被完美解決了。


\(\text{Code}:\)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#define maxn 10000005
#define Rint register int
#define INF 0x3f3f3f3f
using namespace std;
typedef long long lxl;

template <typename T>
inline T read()
{
	T x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}

int prime[maxn],cnt;
bool flag[maxn];
lxl mu[maxn];
lxl N,M,K,pri[maxn],prc;

inline void sieve()
{
	mu[1]=1;
	for(int i=2;i<maxn;++i)
	{
		if(!flag[i]) prime[++cnt]=i,mu[i]=-1;
		for(int j=1;j<=cnt&&i*prime[j]<maxn;++j)
		{
			flag[i*prime[j]]=true;
			if(!(i%prime[j])) break;
			mu[i*prime[j]]=-mu[i];
		}
	}
	for(int i=1;i<maxn;++i)
		mu[i]+=mu[i-1];
	for(int i=1;i<=cnt;++i)
	{
		while(!(K%(prime[i]*prime[i]))) K/=prime[i];
		if(!(K%prime[i])) pri[++prc]=prime[i];
	}
}

unordered_map<int,lxl> mp;

inline lxl G1(int n)
{
	if(n<maxn) return mu[n];
	if(mp[n]) return mp[n];
	lxl res=1;
	for(lxl l=2,r=0;l<=n;l=r+1)
	{
		r=n/(n/l);
		res-=(r-l+1)*G1(n/l);
	}
	return mp[n]=res;
}

unordered_map<int,unordered_map<int,lxl> > F,G;

inline lxl f(int n,int k,int p=1)
{
	if(!n) return 0;
	if(k==1) return 1ll*n;
	if(F[n][k]) return F[n][k];
	return F[n][k]=f(n,k/pri[p],p+1)-f(n/pri[p],k/pri[p],p+1);
}

inline lxl g(int n,int k,int p=1)
{
	if(!n) return 0;
	if(k==1) return G1(n);
	if(G[n][k]) return G[n][k];
	return G[n][k]=g(n,k/pri[p],p+1)+g(n/pri[p],k,p);
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("P1587.in","r",stdin);
#endif
	N=read<int >(),M=read<int >(),K=read<int >();
	sieve();
	lxl res=0;
	int up=min(N,M);
	for(lxl l=1,r=0;l<=up;l=r+1)
	{
		r=min(N/(N/l),M/(M/l));
		res+=1ll*(N/l)*f(M/l,K)*(g(r,K)-g(l-1,K));
	}
	printf("%lld\n",res);
	return 0;
}


參考文獻:

神犇柳蘇明的題解

11Dimensions的課件。