Loading

7366. 【2021.11.10NOIP提高组联考】可怜的木偶

Description

可怜的木偶在数轴上表示 \(k !\) 的点上,她有 \(n\) 个虚幻的袋鼠,她可以使用第 \(i\) 个虚幻的袋鼠让自己向前 或向后移动 \(a_{i}\) 的距离,但她必须时刻保证自己的坐标为正整数,在这种规则下可怜的木偶的坐标最小值 为使用任意多次虚幻的袋鼠能达到的最小坐标。

但是你考虑这样一件事情,就是说:可悲的天使愤怒地爬来爬去着。所以每个 \(a_{i}\) 都是在 \([1, k]\) 内等概率 随机的 (注: 对于第 \(i\) 个虚幻的袋鼠, \(a_{i}\) 是在一开始随机的,而不是对于每次使用随机)。

现在可怜的木偶想知道自己期望的坐标最小值,\(998244353\) 取模,如果你不能立刻求出来,那么残 酷的智慧就会被残酷的袋鼠所无知地遗弃。这真的是伟大的啊!!!

\(1\le n\le 10^9,1\le k\le 10^6\)

Solution

注意到起点为 \(k!\),这意味着我们一定可以走到 0。

那么这个题目就转换成了期望 \(\gcd\)

\(f_x\) 表示 \(\gcd\) 恰好为 \(x\)\(g_x\) 表示 \(x|\gcd\)

就有

\(g_x=\sum_{x|d} f_d\)

可以莫反得到

\(f_x=\sum_{x|d} \mu(\frac{d}{x}) g(d)\)

\(f_x=\sum_{x|d} \mu(\frac{d}{x})\lfloor\frac{k}{d}\rfloor^n\)

答案就是 \(\frac{\sum^n_{i=1}i\times f(i)}{k^n}\)

\(k^n\) 先不管,想一下上面怎么再优化一下。

我们把他展开一下得到

\(\sum_{d1=1}^k\sum_{d2=1}^{\lfloor\frac{k}{d1}\rfloor} \mu(d2)\lfloor\frac{k}{d1\times d2}\rfloor^n\)

这里我们枚举 \(d1\times d2\),得到

\(\sum_{i=1}^k\lfloor\frac{k}{i}\rfloor^n\sum_{j|i}j\times \mu(\frac{i}{j})\)

\(\sum_{j|i}j\times \mu(\frac{i}{j})\) 可以用狄利克雷卷积变成 \(\varphi(i)\)

因此最后的答案就是

\[\frac{\sum_{i=1}^k\lfloor{\frac{k}{i}}\rfloor^n\varphi(i)}{k^n} \]

Code

#include<cstdio>
#define mod 998244353
#define ll long long
using namespace std;
int prt,pri[1000005],phi[1000005],T;
ll n,k,ans,sum;
ll ksm(ll x,ll y)
{
	ll res=1;
	while (y)
	{
		if (y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
int main()
{
	freopen("dance.in","r",stdin);
	freopen("dance.out","w",stdout);
	phi[1]=1;
	for (int i=2;i<=1000000;++i)
	{
		if (!phi[i])
		{
			pri[++prt]=i;
			phi[i]=i-1;
		}
		for (int j=1;j<=prt;++j)
		{
			int x=i*pri[j];
			if (x>1000000) break;
			if (i%pri[j]==0)
			{
				phi[x]=phi[i]*pri[j];
				break;
			}
			phi[x]=phi[i]*(pri[j]-1);
		}
	}
	scanf("%d",&T);
	while (T--)
	{
		scanf("%lld%lld",&n,&k);
		sum=0;
		for (int i=1;i<=k;++i)
			sum=(sum+ksm((k/i),n)*phi[i]%mod)%mod;		
		ans=sum*ksm(ksm(k,n),mod-2)%mod;
		printf("%lld\n",ans);
	}
	return 0;
}
posted @ 2021-11-11 08:33  Thunder_S  阅读(67)  评论(0编辑  收藏  举报