根据题意:
可以把题目看成
这个式子对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";
}