题面
题目描述
输入 n n n和 k k k,判断 n % 1 n\%1 n%1到 k k k每个数的余数是不是都不相同
输入格式
输入数据包含多组,每行两个数字 n n n、 k k k,空格隔开。 以 00 0 0 00结束
输出格式
对于每行的有效数据,如果所有余数均不相同,输出 Y e s Yes Yes,否则输出 N o No No
一句话题面
给定 n n n, k k k ( n n n, k ≤ 1 0 18 k\leq 10^{18} k≤1018)
回答 n % i , i ∈ [ 1 , k ] n\ \%\ i, i\in [1,k] n % i,i∈[1,k]是否都不同
思路分析
暴力思路
枚举
1
1
1~
k
k
k,看看余数是否相同
但是TLE
是少不了的
一点优化
当
N
≤
K
N\le K
N≤K时,直接No
因为
N
%
1
=
0
N\%1=0
N%1=0
N
%
N
=
0
N\%N=0
N%N=0
但还是TLE
,分数也不变
一分都没多讲了有什么用啊
正解分析
推数据
样例数据
5 3
—Yes
5 % 1 = 0 5\%1=0 5%1=0 |
---|
5 % 2 = 1 5\%2=1 5%2=1 |
5 % 3 = 2 5\%3=2 5%3=2 |
好像有点规律
再来一组
5039 7
—Yes
5039 % 1 = 0 5039\%1=0 5039%1=0 |
---|
5039 % 2 = 1 5039\%2=1 5039%2=1 |
5039 % 3 = 2 5039\%3=2 5039%3=2 |
5039 % 4 = 3 5039\%4=3 5039%4=3 |
5039 % 5 = 4 5039\%5=4 5039%5=4 |
5039 % 6 = 5 5039\%6=5 5039%6=5 |
5039 % 7 = 6 5039\%7=6 5039%7=6 |
好像真有规律
普遍数据
N K
—Yes
(
N
<
K
)
(N<K)
(N<K)
算式 | 可取余数 |
---|---|
N % 1 = ∈ [ 0 , 0 ] N\%1=\in[0,0] N%1=∈[0,0] | 0 |
N % 2 = ∈ [ 0 , 1 ] N\%2=\in[0,1] N%2=∈[0,1] | |
N % 3 = ∈ [ 0 , 2 ] N\%3=\in[0,2] N%3=∈[0,2] | |
N % 4 = ∈ [ 0 , 3 ] N\%4=\in[0,3] N%4=∈[0,3] | |
… … …… …… | … … …… …… |
N % K = ∈ [ 0 , K − 1 ] N\%K=\in[0,K-1] N%K=∈[0,K−1] |
可以通过普遍的数据看出
如果回答是Yes
,那么
N
%
i
=
i
−
1
N\%i=i-1
N%i=i−1(
i
∈
[
1
,
K
]
i\in[1,K]
i∈[1,K])
正解
当
N
%
i
=
i
−
1
N\%i=i-1
N%i=i−1(
i
∈
[
1
,
K
]
i\in[1,K]
i∈[1,K])时,输出Yes
当
N
%
i
≠
i
−
1
N\%i\not=i-1
N%i=i−1(
i
∈
[
1
,
K
]
i\in[1,K]
i∈[1,K])时,输出No
完整代码
#include<bits/stdc++.h>
using namespace std;
long long N,K;
bool ans;
int main(){
while(1){
ans=1;
scanf("%lld%lld",&N,&K);
if(N==0&&K==0)return 0;
for(long long i=1;i<=K;i++){
if(N%i!=i-1) {
ans=0;
break;
}
}
if(ans)printf("Yes\n");
else printf("No\n");
}
}