1127noip模拟赛(命运fate)

智慧t2,我不智慧,赛时想到了一点点。。

题意:

给一个单调不降的序列 a1,a2,...,an 。 给定一个整数 x。求一个 b 序列使得 任意 i(1<in) aibi<ai+1bi+1i<j<x  bibj.x<j<i  bibj

做法:

整理一下 设最后的 aibi 序列为 c .

1i<x:

aiai+1bibi+1cici+1aiciai+1ci+1ciaici+1ai+1ci+ai+1aici+1cici+1ci+ai+1ai

所以 取值范围有 ai+1ai+1 种。直接 prod 起来就好。

x<in :

也就是要求 x 右侧的不降序列,再减去一个不增序列,仍然是一个不降序列,且要求最终序列第一个元素不小于 ax

不难发现,在这种情况下,如果最终序列第一个元素不小于 ax 的要求被满足,后面的元素依然还是不降的(后面更大的元素,减去了一个更小的数,显然还是不会比你小)。 令 len=nx y=ax+1ax ,那么问题变成了数长度为 len,值域在 [0,d] 的序列个数。

插板法一下 ,答案就是 (y+lenlen).

然后两边乘起来。

最终答案就是

(ax+1ax+nxnx)i=1x1(aiai1+1)

妙妙妙妙米奇妙妙屋

代码:

直接放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

posted @   Slayer-WT!!!!!!!!  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示