【比赛随笔】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我还太菜,没有调出来