- 培养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;
}