1127noip模拟赛(命运fate)
智慧t2,我不智慧,赛时想到了一点点。。
题意:
给一个单调不降的序列 。 给定一个整数 。求一个 序列使得 任意 且 。
做法:
整理一下 设最后的 序列为 .
当
所以 取值范围有 种。直接 prod 起来就好。
当 :
也就是要求 右侧的不降序列,再减去一个不增序列,仍然是一个不降序列,且要求最终序列第一个元素不小于 。
不难发现,在这种情况下,如果最终序列第一个元素不小于 的要求被满足,后面的元素依然还是不降的(后面更大的元素,减去了一个更小的数,显然还是不会比你小)。 令 ,那么问题变成了数长度为 ,值域在 的序列个数。
插板法一下 ,答案就是 .
然后两边乘起来。
最终答案就是
妙妙妙妙米奇妙妙屋
代码:
直接放std了。懒得写。对不起。
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,a[300005],x;
int qpow(int a,int b)
{
if(b==0) return 1;
int g=qpow(a,b/2);
g=1ll*g*g%mod;
if(b&1) g=1ll*g*a%mod;
return g;
}
int solvel()
{
int ans=1;
for(int i=1;i<x;i++)
{
ans=1ll*ans*(a[i]-a[i-1]+1)%mod;
}
return ans;
}
int solver()
{
if(x==n) return 1;
int d=a[x+1]-a[x],ans=1,len=n-x;
//C(d+len,len)
for(int i=len,j=d+len;i>=1;i--,j--)
{
ans=1ll*ans*qpow(i,mod-2)%mod*j%mod;
}
return ans;
}
int main()
{
freopen("fate.in","r",stdin);
freopen("fate.out","w",stdout);
assert(cin>>n);
for(int i=1;i<=n;i++)
{
assert(cin>>a[i]);
}
assert(cin>>x);
cout<<1ll*solvel()*solver()%mod;
assert(!(cin>>x));
}
这个马蜂i dont like
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】