[思维]ACM-T1-余数研究

题面

题目描述

输入 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} k1018

回答 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 NK时,直接No
因为 N % 1 = 0 N\%1=0 N%1=0 N % N = 0 N\%N=0 N%N=0
但还是TLE,分数也不变
一分都没多讲了有什么用啊

正解分析

推数据

样例数据

5 3Yes

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 7Yes

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 KYes ( 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]0,1
N % 3 = ∈ [ 0 , 2 ] N\%3=\in[0,2] N%3=[0,2]0,1,2
N % 4 = ∈ [ 0 , 3 ] N\%4=\in[0,3] N%4=[0,3]0,1,2,3
… … …… … … ……
N % K = ∈ [ 0 , K − 1 ] N\%K=\in[0,K-1] N%K=[0,K1]0,1,2, … … …… ,K-2,K-1

可以通过普遍的数据看出
如果回答是Yes,那么 N % i = i − 1 N\%i=i-1 N%i=i1( i ∈ [ 1 , K ] i\in[1,K] i[1,K])

正解

q u e s t i o n : “ N   K " = { a n s = “ Y e s ” ( N % i = i − 1 ( i ∈ [ 1 , K ] ) ) a n s = “ N o ” ( N % i ≠ i − 1 ( i ∈ [ 1 , K ] ) ) question:“N \ K"=\left\{ \begin{aligned} ans &= “Yes”(N\%i=i-1(i\in[1,K])) \\ ans &= “No” (N\%i\not=i-1(i\in[1,K]))\\ \end{aligned} \right. questionN K"={ansans=Yes(N%i=i1(i[1,K]))=No(N%i=i1(i[1,K]))

完整代码

#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");
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值