rt 看了一下讲解,我没理解错的话,就是枚举每一对边对答案的贡献乘上他出现的概率,效率是n方的,然后我自己实现了一下,但是错掉了,想了很久也没有觉得哪里有问题,请各位大佬帮忙qwq
#include<bits/stdc++.h>
using namespace std ;
#define int long long
#define kkksc signed main
#define ddd double
#define maxn 1000010
#define lc (o << 1)
#define rc ((o << 1) | 1 )
int read(){
int ans = 0 , f = 1 ; char ch = getchar() ;
while(ch < '0' || ch > '9'){ if(ch == '-') f = -1 ; ch = getchar() ; }
while(ch >= '0' && ch <= '9') {
ans = (ans * 10) + ch - '0' ;
ch = getchar() ;
}
return ans * f ;
}
const int mod = 998244353 ;
int a[maxn] ;
int fac[maxn] , infac[maxn] ;
int n , k , ans ;
int ksm(int a , int b){
int res = 1 ;
while(b){
if(b&1) res = (res * a ) % mod ;
a = (a * a) % mod ;
b >>= 1 ;
}
return res ;
}
void pre(){
fac[0] = 1 ;
for(int i = 1 ; i <= 1e6 ; i++)
fac[i] = fac[i - 1]*i % mod ;
infac[1000000] = ksm(fac[1000000] , mod - 2) ;
for(int i = 1e6 - 1 ; i >= 0 ; i--){
infac[i] = infac[i + 1] * (i + 1) % mod ; //if(infac[i] != ksm(fac[i] , mod - 2)) printf("i : %lld\n" , i);
}
}
kkksc(){
// freopen("test.in" , "r" , stdin) ;
// freopen("test.out" , "w" , stdout) ;
n = read(), k = read() ;
pre() ;
for(int i = 1 ; i <= n ; i++) a[i] = read() ;
ans += a[1] ;
// for(int i = 1 ; i <= 10 ; i++)
// printf("infac[%lld] : %lld \n" , i , infac[i]) ;
for(int i = 2 ; i <= n ; i++){
int st = max(1ll , i - k) , ed = i - 1 , len = ed - st + 1 ;
// printf("i : %lld ed : %lld st : %lld len : %lld \n" , i , st , ed , len) ;
for(int j = st ; j <= ed ; j++){
ans = a[i] > a[j] ? (ans + (a[i] - a[j]) * infac[len] % mod + mod ) % mod : ans ;
}
}
// printf("%lld %lld \n" , fac[3] , ksm(fac[3] , mod - 2)) ;
// cout << 5 * infac[3] << endl ;
printf("%lld" , (ans + mod) % mod) ;
}
对于只包含0或1的情况,我的输出与正解相差较大,但我自己手算了一下,感觉我的没有问题
比如这组数据
5 5
0 0 0 1 1
我手算后是三分之五(我知道要整逆元),但是题解答案的好像不一致,求大佬解答,是不是我理解错了