原题:
格莱美有一个整数序列 a1,a2,…,an。她认为序列中的元素太多,因此决定在序列中加入一个算术级数。从形式上看,她可以选择两个非负整数 s,d,并在每个 k∈[1,n] 的基础上将 s+kd 加到 ak 中。由于我们想破坏图例,请告诉她操作后元素 modulo m 的最小和。注意,应在取模后将和最小化
解析:
其实通过分析就可以列出一个式子
然后经过化简即可得出答案,这道题主要就是难在这个化简过程,化简如下:
代码如下:
#include<iostream>
using namespace std;
typedef long long ll;
ll extend_gcd(ll a, ll b, int& x, int& y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int r = extend_gcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r;
}
int main()
{
int n, m, s, d, k1, k2, ans;
cin >> n >> m;
int sum = 0;
for (int i = 0; i < n; i++)
{
int t;
cin >> t;
sum += t;
}
sum %= m;
int g1 = extend_gcd(n, n * (n + 1) / 2, s, d);
int g2 = extend_gcd(g1, m, k2, k1);
ans = sum % g2;
cout << ans << endl;
k2 = (k2 * ((ans - sum) / g2)%m) % m;
s = (s%m * k2%m+m ) % m;
d = (d%m * k2%m+m ) % m;
cout << s << ' ' << d << endl;
}