2022icpc杭州站A题 题解

根据题意:

可以把题目看成

这个式子对m取模最小。

根据裴蜀定理:ax+by=k*gcd(a,b).

设p,pp;

p=gcd(a,b)

pp=gcd(p,m)

求解:x,y

ax+bypp(mod m)

即ax+by+pp*k=0;

ans等于pp;

数据可能会很大,所以需要对 m 取模

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int c[N];
int exgcd(int a, int b, int &x, int &y)
{
	if(!b){
		x=1,y=0;
		return a;
	}
	int x1,y1,gcd;
	gcd=exgcd(b,a%b,x1,y1);
	x=y1,y=x1-a/b*y1;
	return gcd;
}
signed main(){
	int n,m;
	cin>>n>>m;
	int sum=0;
	for(int i=1;i<=n;i++){
		cin>>c[i];
		sum+=c[i];
	}
	int a,b,x,y,xx,yy;
	a=n;
	b=n*(n+1)/2;
	int p=__gcd(a,b);
	int pp=__gcd(p,m);
	int ans = sum%pp;
	exgcd(p,m,x,y);
	x*=((ans-sum)/pp)%m;
	x %= m;
	exgcd(a,b,xx,yy);
	xx *= x;
	yy *= x;
	cout<<ans<<"\n";
	cout<<(xx%m+m)%m<<" "<<(yy%m+m)%m<<"\n";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值