【LGR-078】洛谷 10 月月赛 II T2深海少女与胖头鱼

显然:
设 A [ i ] [ j ] 位 i 只 鱼 没 圣 盾 , j 只 鱼 有 圣 盾 则 转 移 为 A [ i ] [ j ] = ( A [ 1 ] [ i + j − 1 ] + 1 ) ∗ ( j / ( i + j ) ) + ( A [ i − 1 ] [ j ] + 1 ) ∗ ( i / ( i + j ) ) [ i > = 1 且 转 移 ( 1 ) 要 求 [ j > = 2 ] ] 设A[i][j]位i只鱼没圣盾,j只鱼有圣盾 \\ 则转移为\\ A[i][j] = (A[1][i + j - 1] + 1) * (j / (i + j))+(A[i - 1][j] + 1) * (i / (i + j))[i >= 1 且转移(1)要求[j>=2]] A[i][j]ijA[i][j]=(A[1][i+j1]+1)(j/(i+j))+(A[i1][j]+1)(i/(i+j))[i>=11[j>=2]]
对于 j < 2 j < 2 j<2,有:
A [ 1 ] [ i ] = ( A [ 1 ] [ i − 1 ] + 2 ) ∗ ( 1 / ( i + 1 ) ) + ( A [ 1 ] [ i − 1 ] + 1 ) ∗ ( i / ( i + 1 ) ) 最 后 为 A [ 1 ] [ i ] = ( i 2 + 5 ∗ i + 2 ) / 2 30 p t s G E T s \\ A[1][i] = (A[1][i - 1] + 2) * (1/ (i + 1)) + (A[1][i - 1] + 1) * (i / (i + 1)) \\ \\ 最后为 \\ A[1][i] = (i ^2 + 5 * i + 2) / 2 \\ 30ptsGETs A[1][i]=(A[1][i1]+2)(1/(i+1))+(A[1][i1]+1)(i/(i+1))A[1][i]=(i2+5i+2)/230ptsGETs

#include<bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;

ll n,m,mod = 998244353;

ll mul(ll x , ll y){
	ll zz = 0;
	while(y){
		if(y & 1)zz = (zz + x) % mod;
		x = (x + x) % mod;
		y = y >> 1;
	}
	return zz;
}

ll poww(ll x , ll y){
	ll zz = 1;
	while(y){
		if(y & 1)zz = mul(zz , x);
		x = mul(x , x);
		y = y >> 1;
	}
	return zz;
}

int main(){
	cin>>n>>m;
	if(m == 0){
		cout<<mul((mul(n , n) + mul(3 , n)) % mod , poww(2ll , mod - 2ll));
	}
}

A [ i ] [ j ] ∗ ( i + j ) = ( A [ 1 ] [ i + j − 1 ] + 1 ) ∗ j + ( A [ i − 1 ] [ j ] + 1 ) ∗ i 发 现 j 时 独 立 的 因 为 第 一 项 可 以 O ( 1 ) A[i][j] * (i + j) = (A[1][i + j - 1] + 1) * j+(A[i - 1][j] + 1) * i \\ 发现j时独立的 因为第一项可以O(1) A[i][j](i+j)=(A[1][i+j1]+1)j+(A[i1][j]+1)ijO1
然后这题就没有了
大部分做不了这题的人大概是卡在第一步了。。。。(包括我)
看我这菜的哟

#include<bits/stdc++.h>
#define MAXN 1000005
typedef unsigned long long ll;
using namespace std;

ll n,m,mod = 998244353,f[MAXN];

ll mul(ll x , ll y){
	x %= mod;
	y %= mod;
	ll zz = 0;
	while(y){
		if(y & 1)zz = (zz + x) % mod;
		x = (x + x) % mod;
		y = y >> 1;
	}
	return zz;
}

ll poww(ll x , ll y){
	ll zz = 1;
	while(y){
		if(y & 1)zz = mul(zz , x);
		x = mul(x , x);
		y = y >> 1;
	}
	return zz;
}

ll val(ll x){return mul((mul(x , x) + mul(5 , x) + 2) % mod , poww(2 , mod - 2));}

int main(){
	cin>>n>>m;
	f[0] = mul((mul(n , n) + mul(3 , n)) % mod , poww(2ll , mod - 2ll));
	f[1] = val(n);
	for(int i = 2 ; i <= m ; i++){
		f[i] = mul(mul(f[i - 1] , i) + mul(val(i + n - 1) , n) + n + i , 
		poww(i + n , mod - 2));
	}
	cout<<f[m]<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值