一道很没意思的数学,东分析西分析最后能推出来,但是感觉没什么意思。但是看了一圈题解区为什么没有证明?遂发之。
证明都在注释里了,应该还算完备(? 有不懂的地方留言或私信我
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=300005;
int n, m;
void solve() {
cin>>n>>m;
//第一点,总有 a[i]<i, a[1]=0
//mod条件转换一下,k*i+a[i]=a[i+1], k为整数
//整理一下 k*i+a[i]<i+1
//显然 k<2
//假设k=2,2*i+a[i]<i+1,恒不成立,证毕
//继续看这个式子,就会发现但凡a[i]>0, k就取不到 1了
//k取0的意思是前后两项相等
//又有k取1的时候只有a[i]=0
//得到最终数组只能形如000011111x,最后一位比较特殊
//讨论一下,如果a[n-1]=0,a[n]必须被n-1整除
//a[i]最大等于n,n-1能整除 n当且仅当 n=2
//所以就有如果n>2, 要么a[n]=0要么a[n]=n-1,若n=2还可以取到n
//如果a[n-1]=1,a[n]在模 n-1意义下等于 1
//a[n]要么等于 1,要么等于 n-1+1=n,恰好取到最大值
//所以说,这个题目最多只能取到3个不同的数,m>3直接就没有
//如果m=1,全为0,一个
//如果m=2,形如000011111,或前n-1个0+最后一个n-1
//第一种讨论一下01分割点发现数量是n-2,共计n-2+1=n-1个
//如果m=3,00001111x,一个
//注意题目里m是至少,累加一下
if(m>3) cout<<0<<'\n';
else if(m==3) cout<<1<<'\n';
else if(m==2) cout<<n<<'\n';
else cout<<n+1<<'\n';
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
// solve();
int T; cin>>T; while(T--) solve();
return 0;
}

京公网安备 11010502036488号