题面
题目描述
输入 n n n 和 k k k,判断 n n n m o d mod mod 1 1 1 ~ k k k 每个数的余数是不是都不相同
输入
输入数据包含多组,每行两个数字 n n n、 k k k,空格隔开。 以 0 0 0 0 0 0结束
输出
对于每行的有效数据,如果所有余数均不相同,输出 Y e s Yes Yes,否则输出 N o No No
样例输入
4 4
5 3
0 0
样例输出
No
Yes
提示
说明/提示
n
,
k
≤
1
0
18
n,k≤10^{18}
n,k≤1018
【样例解释】
对于
4
4
4
4
4
4
由于
4
4
4
m
o
d
mod
mod
1
1
1 和
4
4
4
m
o
d
mod
mod
2
2
2 都是
0
0
0,所以是
N
o
No
No
对于
5
5
5
3
3
3
由于
5
5
5
m
o
d
mod
mod
1
=
0
1=0
1=0
5
5
5
m
o
d
mod
mod
2
=
1
2 = 1
2=1
5
5
5
m
o
d
mod
mod
3
=
2
3 = 2
3=2
所以余数各不相同,输出
Y
e
s
Yes
Yes
题目分析
输入 n n n 和 k k k,判断 n n n m o d mod mod 1 1 1 ~ k k k 每个数的余数是不是都不相同
我们将这段话分析后,会发现:
n
n
n
m
o
d
mod
mod
1
=
0
1=0
1=0
为保证每个数的余数都不相同,就需要
n
n
n
m
o
d
mod
mod
2
=
1
2=1
2=1
以此类推:
n
n
n
m
o
d
mod
mod
3
=
2
3=2
3=2
n
n
n
m
o
d
mod
mod
4
=
3
4=3
4=3
n
n
n
m
o
d
mod
mod
5
=
4
5=4
5=4
……
n
n
n
m
o
d
mod
mod
i
=
i
−
1
i=i-1
i=i−1
也就是说
(
n
+
1
)
(n+1)
(n+1)
m
o
d
mod
mod
i
=
0
i=0
i=0
(
1
≤
i
≤
k
)
(1\le i \le k)
(1≤i≤k)
然后我们可以发现,这个数必须是
k
!
k!
k! 的倍数
−
1
-1
−1,而
20
!
20!
20! 就已经爆
l
o
n
g
long
long
l
o
n
g
long
long 了,所以当
k
>
20
k>20
k>20 或
k
≥
n
k\ge n
k≥n 时肯定不能满足条件 (我乱讲的) ,所以可以排除。
code
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long n,k,p;
bool flag;
int main(){
int i;
while(1){
flag=0;
scanf("%lld%lld",&n,&k);
if(!n&&!k) return 0;
if(k>20){
printf("No\n");
continue;
}
p=1;
for(i=1;i<=k;i++)
if(n%i!=i-1){
flag=1;
printf("No\n");
break;
}
if(flag==0) printf("Yes\n");
}
}