Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) C 數論
阿新 • • 發佈:2018-11-17
題目連結:http://codeforces.com/contest/1055/problem/C
題目思路:找到最大公因數,然後la,ra對ta取餘,lb,rb對tb取餘,然後求得la,lb之差,然後列舉k倍的最大公因數+la,算最大,這樣時間複雜度太高,就直接將差/最大公因數=temp,列舉temp-1,temp,temp+1,求出最大值
AC程式碼
#include<bits/stdc++.h> using namespace std; int la,ra,ta; int lb,rb,tb; int laa,raa,taa; int lbb,rbb,tbb; int dis() { if(raa<lbb||rbb<laa) return 0; return min(raa,rbb)-max(laa,lbb)+1; } int main() { scanf("%d%d%d",&la,&ra,&ta); scanf("%d%d%d",&lb,&rb,&tb); la=la%ta; ra=ra%ta; lb=lb%tb; rb=rb%tb; int temp=__gcd(ta,tb); int ans=0; if(la<=lb) { int dif=lb-la; dif=dif/temp; for(int i=dif-1;i<=dif+1;++i) { laa=la+temp*i; raa=ra+temp*i; lbb=lb; rbb=rb; ans=max(ans,dis()); } } else { int dif=la-lb; dif=dif/temp; for(int i=dif-1;i<=dif+1;++i) { laa=la; raa=ra; lbb=lb+temp*i; rbb=rb+temp*i; ans=max(ans,dis()); } } printf("%d\n",ans); }