SS有点不稳定一直进不去cf,进去的时候已经过了不少时间了,然后人就比较着急,反而做的更慢了。

A题数学题 很简单

B题数学题 很简单

C题我看出来是一道dp题了,也看出来这道题可以用数学方法直接推公式了。
然而我没推出dp递推公式,也没推出数学公式。
这道题需要简单转换一下,然后才能做,这里我没想到这一点,题目做的不够多吧。
题意是[1,n]范围中任取构成数列An和数列Bn,满足An为非降序列,Bn为非升序列,且Ai>=Bi。
由题意易推出Am>=Ai,Bm<=Bi;又由Am>=Bm可使Bn逆序连接An构造一个长度为2m的非降序列Cn;

解法1(排列组合):
然后再有高中知识排列组合转换为求C(n+2m-1,2m)的问题,然后套公式就出来了,看官方题解用的python短短几行就实现了大数的计算,有空自己也要去学一下python,偶尔用一下做有关计算的问题应该挺爽的。

python用排列组合算应该是自带高精度可以直接做的,但是C++做起来很麻烦。
1.nCrModp:
https://www.geeksforgeeks.org/compute-ncr-p-set-1-introduction-and-dynamic-programming-solution/amp/
数据过大会TLE

int nCrModp(int n,int r,int p){
	int C[r+1];
	memset(C,0,sizeof(C));
	C[0]=1;
	for(int i=1;i<=n;i++){
		for(int j=min(i,r);j>0;j--){
			C[j]=(C[j]+C[j-1])%p;
		}
	}
	return C[r];
}

2.Lucas定理(√)


解法2(dp):
推递推式f[i][j]=f[i-1][j]+f[i][j-1];//dp[i][j]表示第i位置放数字j的方案数,在i位置放j-1情况时必然i-1位置也能放j;
如果写f[i][j]=f[i-1][j]+f[i][j+1];内层for循环就要j就要逆序遍历由n到1,这样的意义是将非降序列看做看非升序列,两者本质就是掉个头看,也能算出正确答案。
当然别忘了要%mod。

第一次打cf加分,虽然只加了12,不过还是有进步的或许?