关于梦熊「RiOI-4」上课 部分分九分的做法,求调
  • 板块学术版
  • 楼主canwen
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/9/8 18:19
  • 上次更新2024/9/8 20:54:29
查看原帖
关于梦熊「RiOI-4」上课 部分分九分的做法,求调
1284815
canwen楼主2024/9/8 18:19

second。

已经红温。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,q,ans,xx;
struct node{
	int l,r;
}e[10];
int x,y;
void exgcd(int a, int b)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    exgcd(b, a % b);
    int Last_x = x;
    x = y;
    y = Last_x - a / b * y;
}
int s[10];
int f(){
	int u = 0,q=0;
	for(int i=1;i<=n;i++){
		u+=s[i],u%=mod;
	}
	x=y=0;
	exgcd(n, mod);
	x = (x % mod + mod) % mod;
	u = u * x % mod; 
	for(int i = 1;i<=n;i++){
		s[i]%=mod;
		q+=(((s[i]-u)%mod+mod)*((s[i]-u)%mod)%mod+mod)%mod;
		q%=mod;
	}
	q = q *  x % mod; 
	return q;
}
void dfs(int k,int sum){
	if(k==n+1&&sum==xx){
		if(ans==1e18) ans = f();
		else ans = min(ans,f());
		return;
	}
	if(k==n+1) return;
	for(int i=e[k].l;i<=e[k].r;i++){
		s[k]=i;
		dfs(k+1,sum+i);
	}
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&e[i].l,&e[i].r); 
	}
	while(q--){
		scanf("%lld",&xx);
		ans = 1e18;
		dfs(1,0);
		printf("%lld\n",ans%mod);
	}
	return 0;
}

PS:有理数取余的部分是那道模板题第一篇题解乱搞过来的(因为不会)。((

2024/9/8 18:19
加载中...