CF922C Cave Painting 题解 (作业)

    科技2024-06-07  70

    题面

    题目描述

    输入 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,k1018 【样例解释】 对于 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=i1 也就是说 ( 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) (1ik) 然后我们可以发现,这个数必须是 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 kn 时肯定不能满足条件 (我乱讲的) ,所以可以排除。

    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"); } }
    Processed: 0.010, SQL: 8