A. Modulo Ruins the Legend
因为是%m的意义下 我们尽量一直保持在%意义下 不然会很难注意一些不合法情况
原式可变形为(n(n+1)/2 d + ns + sum )%m 最小
我们设a=n(n+1)/2 b=n
(ad+bs+sum)%m
设g1=gcd(a,b) 里面的ad+bs又exgcd可得
(kg1+sum)%m
这里就可以发现这里如果直接写的话 sum可能大于m的 g1也可能大于m的 这样求出来的k可能是负数
这样回代的时候就可能搞成负数
将%m放里面来搞一搞
(kg1+mt+sum%m)%m
左边两个也是只有t和k不知道 g2=gcd(g1,m) sum2=sum%m
(zg2+sum2)%m
我们直接可以将z求出来 m-sum2/g+1 或者 m-sum2/g 必然有一个是贴近m的也就是最小值
而且这样z必然是正数 然后我们就无脑回代 注意取模就可以了
void solve(){
cin>>n>>m;
int sum=0;
for(int i=0;i<n;i++){
int x;cin>>x;
sum+=x;
}
int a=n,b=n*(n+1)/2;
int s,dt;
int d=__gcd(n,n*(n-1)/2);
sum%=m;
exgcd(a,b,s,dt);
int k,t;
int g=__gcd(m,d);
exgcd(d,m,k,t);
int z=up(m-sum%m,g);
(k*=z)%=m;
s = ((s % m * k) % m + m) % m, dt = ((dt % m * k) % m + m) % m;
cout << (z * g + sum%m)%m << endl;
cout << s << " " << dt << endl;
}
标签:gcd,int,sum,sum2,2022,sum%,杭州,dt
From: https://www.cnblogs.com/ycllz/p/16967594.html