【比赛随笔】2020.4.25NOIonline2

之前许多比赛没有统一记录,可能从这次开始会认真打比赛的博客了。

p.s.这里的数据是洛谷上的民间数据、

T1 涂色游戏

这题据说是cf的原题,不过作为蒟蒻的我,没有打过。

题目链接在这里

题意分析

这题的10的20次方并没有什么用,其实用处只在于让你打消打暴力的念头。

比赛时我在找规律,手推样例,发现用较大的p2除以较小的p1得到的商比k-1小就可以判断结果

中间会加上一些特例,但很明显这是错的。主要是因为我太菜了。

中间我想到了求gcd,但我将两个数相除,gcd就显得没有用了,菜逼的我就没有求。

这里讲正解:

这里p1和p2会组成循环节,所以只用考虑lcm(p1,p2)之内的范围

然后在一个循环节内定义两个p1之间为小块,两个p2之间为大块(p1<=p2)

那么手推可得:大块数量×(k−1)≥小块数量−1

最后还要特判k==1时,直接输出no

代码

#include<cstdio>
#include<iostream>
#include<cctype>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

inline long long read(){
    long long s=0;bool flag=true;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')flag=false;ch=getchar();}
    while(isdigit(ch)){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
    return flag?s:-s;
}

inline long long Gcd(long long a,long long b){return b?Gcd(b,a%b):a;}

signed main(){
    long long T=read();
    while(T--){
        long long p1=read(),p2=read(),k=read();
        if(k==1){puts("NO");continue;}
        if(p1>p2)    swap(p1,p2);//保证p1<=p2
        long long gcd=Gcd(p1,p2),lcm=p1*p2/gcd;
        ((lcm/p2)*(k-1)>=(lcm/p1)-1)?puts("Yes"):puts("No");
    }
    return 0;
}

T2T3我还太菜,没有调出来

 

posted @ 2020-04-25 17:12  初学者Ming  阅读(191)  评论(0编辑  收藏  举报