4056(2018 青島網路賽J)
阿新 • • 發佈:2018-12-10
題目連結:點選這裡
解題思路:
將t變為最近一個a或者c的倍數,這樣可以避免在最後的時候有可能的坑.
然後很容易就想到最小公倍數是一個週期,然後最後在跑一個求餘的長度.
時間複雜度O(T*max(a,c))
#include<bits/stdc++.h> #define lson l,mid #define rson mid+1,r using namespace std; typedef long long ll; int n,m; const int mx = 1e5+10; ll a,b,c,d,v,t; ll cal(ll x) { ll pre = 0,ans = 0; ll at = 0,ct = 0,s; while(pre<x){ s = min(at+a,ct+c); s = min(x,s); if(s-pre>=v) ans++; if(at+a<=ct+c) at += a; else ct += c; pre = s; } return ans; } int main() { int tt,cas = 1; scanf("%d",&tt); while(tt--){ scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&v,&t); v++; t = max(t/a*a,t/c*c); ll lcm = a/__gcd(a,c)*c; ll ans = (t/a+1)*b + (t/c+1)*d - 1; ans -= cal(lcm)*(t/lcm); ans -= cal(t%lcm); printf("%lld\n",ans); } return 0; }