Tricks
Maximum Value
\(a_i - \left[ \dfrac{a_i}{a_j} \right] a_j = a_i \bmod a_j\)
枚举 \(k=\left[ \dfrac{a_i}{a_j} \right], b=a_j.\)
余数比除数小。 \(b>a-kb>0 \iff (k+1)b>a\geq kb.\)
那么 \(a\) 就是 \(\le (k+1)b\) 的最大数。二分就好。
程式
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int a[N];
int n,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
sort(a+1,a+n+1);
n=unique(a+1,a+n+1)-a-1;
for(int j=1;j<=n;++j)
for(int k=1;k<=a[n]/a[j];++k){
ans=max(ans,a[(lower_bound(a+1,a+n+1,k*a[j])-a-1)]%a[j]);
}
return printf("%d\n",ans),0;
}
Nim 游戏
全部 \(Xor\) 起来,和 \(0\) 比大小,如果相等那先手必败,否则必胜。
证明见 \(OI-wiki.\) 懒得写。
可以扩展到有向图游戏。