zoukankan      html  css  js  c++  java
  • 7366. 【2021.11.10NOIP提高组联考】可怜的木偶

    Description

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

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

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

    (1le nle 10^9,1le kle 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})lfloorfrac{k}{d} floor^n)

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

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

    我们把他展开一下得到

    (sum_{d1=1}^ksum_{d2=1}^{lfloorfrac{k}{d1} floor} mu(d2)lfloorfrac{k}{d1 imes d2} floor^n)

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

    (sum_{i=1}^klfloorfrac{k}{i} floor^nsum_{j|i}j imes mu(frac{i}{j}))

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

    因此最后的答案就是

    [frac{sum_{i=1}^klfloor{frac{k}{i}} floor^nvarphi(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
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    HDU 1251 统计难题(Trie)
    归并排序求逆序数
    HDU 4565 So Easy(矩阵解公式)
    HDU 3306 Another kind of Fibonacci(矩阵+ll超时必须用int&输入必须取模&M必须是int类型)
    IDEA设置一直显示行号
    IntelliJ Idea 常用快捷键列表
    Intellij IDEA快捷键(转)
    Springmvc返回JSON格式到页面中文乱码问题
    java中Date类型无法获取数据库时分秒问题解决方法
    使用阿里大于实现手机验证码
  • 原文地址:https://www.cnblogs.com/Livingston/p/15538336.html
Copyright © 2011-2022 走看看