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.\) 懒得写。

可以扩展到有向图游戏。

posted @ 2024-04-09 17:19  q(x)  阅读(5)  评论(0编辑  收藏  举报