题目链接

题意:

给出你n个数a[i],让你构造出b[]满足:

  • a[i]=b[i].
  • b[1]=s%m.
  • b[i]=(b[i-1]+c)%m;

让你求最大的m,和适当的c.

题解:

很明显我们需要去构造,而且需要判断我们构造出来的是否跟a数组相等,

我们先看一个性质,因为我们每次都是+c那么如果Codeforces 1484B. Restore Modulo(思维+构造)_i++ 那我们是不是可以先把Codeforces 1484B. Restore Modulo(思维+构造)_i++_02当作我们c.那么既然是固定的c,那么如果还有Codeforces 1484B. Restore Modulo(思维+构造)_数组_03

而如果Codeforces 1484B. Restore Modulo(思维+构造)_数组_04所说明Codeforces 1484B. Restore Modulo(思维+构造)_i++_05那么这个差值也是固定的.

剩下的就是利用这两个差值,来找到我们要得最大m.(两个数的和)

Codeforces 1484B. Restore Modulo(思维+构造)_数组_06


软件不好用就这样把,

c是我们求出来的增量就是c,-值是我们的负差, x是a[i],y是a[i]+c,d是y%m的结果,我们知道,a+b=c,我们要求m从图中可以知道,等于负值加上c.这就是最大的m,

之后我们只需要挨个判断每个a[i]是否符合题意即可.

void solve()
{
scanf("%lld", &n);
d = -1, p = -1;
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
}

for(int i = 1; i < n; i++)
{
ll ch = a[i + 1] - a[i];
if(ch > 0)
{
if(d == -1)
{
d = ch;
}
else
{
if(d != ch)
{
puts("-1");
return ;
}
}
}
else
{
ch=-ch;
if(p == -1)
{
p = ch;
}
else
{
if(p != ch)
{
puts("-1");
return ;
}
}

}
}

if(p == -1 || d == -1)
{
puts("0");
return ;
}
ll sum = p + d;

if(a[1] >= sum) ///取余m就说明没有大于等于m的
{
printf("-1\n");
return ;
}
b[1]=a[1];
for(int i = 2; i <= n; ++i)
{
b[i] = (b[i - 1] + d) % sum;
if(b[i] != a[i])
{
puts("-1");
return ;
}
}
printf("%lld %lld\n", sum, d);
}