1 条题解
-
0
自动搬运
来自洛谷,原作者为

Makasukaka
**搬运于
2025-08-24 21:21:52,当前版本为作者最后更新于2018-10-04 16:00:14,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
### 注意!上一篇“飞翔”的题解有误!
首先a,b在mod k 意义下同余,当且仅当 k|(a-b) 即k是(a-b)的一个因子。
这个证明可以考虑mod运算的意义。也可以a%k=b%k 等价于 a-b=0(mod k) 。
因为s<=1e6 所以可以预处理出所有差值,并把他们打上标记。
从小到大枚举,如果一个数x未被标记,那么我们就看他的λ倍是否被标记。λ是枚举的。
如果都没被标记,则说明x是合法的。输出x即可。
关于复杂度,尽管我们枚举了k倍。但运行次数应该是s/2+s/3+s/4...+s/s 根据调和级数

这东西在OI里可以视作log级的
所以复杂度就是O(n^2+slogs) s是数域大小。
至于“飞翔”的题解,没有考虑k是a-b因子的情况。对于数据 a=16,b=6 正确应该输出3,而不是2。
为啥没有卡掉可能是数据有些水。。
codes:
#include<cstdio> #include<cstdlib> const int N=5e3+5,K=1e6+5; int a[N],vis[K],n; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } for(int i=1;i<=n;++i){ for(int j=i+1;j<=n;++j){ int cur=abs(a[i]-a[j]); vis[cur]=1; } } for(int i=n;i<K;++i){ if(!vis[i]){ int f=1; for(int j=i;j<K;j+=i)if(vis[j]){f=0;break;} if(f){ printf("%d\n",i); return 0; } } } return 0; }
- 1
信息
- ID
- 156
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者