其实是一道结论题。
因为模完之后一定有 k k k 个取模后的结果,而每一个取模之后的结果都在 [ 0 , k − 1 ] [0,k-1] [0,k−1]中。
n % 1 = 0 n\%1=0 n%1=0。
而 n % 2 n\%2 n%2 不能和 n % 1 n\%1 n%1 的结果相同,所以 n % 2 = 1 n\%2=1 n%2=1
同理得, n % 3 = 2 n\%3=2 n%3=2
⋯ \cdots ⋯
n % k = k − 1 n\%k=k-1 n%k=k−1
所以,直接验证皆可以了。
优化:如果 k > 20 k>20 k>20 直接输出 N o No No
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,k;
int main(){
scanf("%lld%lld",&n,&k);
if(!n&&!k)return 1;
if(k>20)return printf("No\n"),0;
ll p=1;
for(int i=1;i<=k;i++)if(n%i!=i-1)return printf("No\n"),0;
printf("Yes");
return printf("\n"),0;
}