E.随机过程

  • 培养OI直觉
  • 那么大的组合数根本不可做。当然有的时候你的确能把类似的大数消掉,但是你用心感受一下,在这道题中,你觉得后续真的有机会把它消掉吗?所谓条条大路通罗马,在OI中常常是行不通的。
  • 通过之前的训练,你其实也知道一条路走不通很可能是大方向就完全错了。但在赛时,你的临场体验其实是,【转换视角】的思想一直孤悬于你的脑海中,注视着你在错误的方向上浪费了大量时间。归根结底,你只是记住了【转换视角】这四个字,而没有意识到,“转换视角”的真谛,在于从题目中发现另一个对象,从这个对象出发,操控其他的条件,来辅助你达到最后的目标。
  • 你所铭记的,应该是具体的感受,而不是抽象的法则
  • 更直接的思维方式是,考虑第i层任意一个节点出现的概率,正难则反转化,考虑Trie树中任意一个节点蕴含的意义,1-(1-1/power(26,i))^n,再乘上power(26,i)就得到答案了
    *不一定要推出式子,有时候可以通过朴素的预处理达到同阶的复杂度
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
long long ans=1;
int inv,n,m;
int power(int n,int p)
{
	if(p==0)
	{
		return 1;
	}
	long long tmp=power(n,p/2);
	if(p%2==0)
	{
		return tmp*tmp%mod;
	}
	return tmp*tmp%mod*n%mod;
}
void calc(int k)
{
	if(m>=k)
	{
		if(n<=power(26,k))
		{
			ans+=n;
		}
		else
		{
			ans+=power(26,k);
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	calc(1);calc(2);calc(3);
	for(int i=4;i<=m;i++)
	{
		ans+=n;
	}
	cout<<ans%mod<<" ";
	ans=1;
	inv=power(26,998244351);
	for(int i=1;i<=m;i++)
	{
		long long c=power(inv,i);
		long long cur=1ll*(1-power(1-c,n))*power(26,i)%mod;
		ans=(ans+cur)%mod;
	}
	cout<<(ans+mod)%mod<<endl;
	return 0;
}
posted @ 2024-09-09 11:11  D06  阅读(7)  评论(0编辑  收藏  举报