一道很没意思的数学,东分析西分析最后能推出来,但是感觉没什么意思。但是看了一圈题解区为什么没有证明?遂发之。

证明都在注释里了,应该还算完备(? 有不懂的地方留言或私信我

#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;
}