Codeforces 1484B. Restore Modulo(思维+构造)
原创
©著作权归作者所有:来自51CTO博客作者为最后的荣光的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接
题意:
给出你n个数a[i],让你构造出b[]满足:
- a[i]=b[i].
- b[1]=s%m.
- b[i]=(b[i-1]+c)%m;
让你求最大的m,和适当的c.
题解:
很明显我们需要去构造,而且需要判断我们构造出来的是否跟a数组相等,
我们先看一个性质,因为我们每次都是+c那么如果
那我们是不是可以先把
当作我们c.那么既然是固定的c,那么如果还有
而如果
所说明
那么这个差值也是固定的.
剩下的就是利用这两个差值,来找到我们要得最大m.(两个数的和)

软件不好用就这样把,
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);
}