題意:ios
告訴一個點的位置,以後的點按照x[i]=x[i-1]*ax+bx;,y[i]=y[i-1]*ay+by的規律分佈,初始時你站在一個位置,每秒能夠往四個方向移動,問你在t內最多能走過多少個點
spa
思路:code
經過數據咱們能夠發現,在264就已經超過了1e16也就是t的範圍了,所以地圖內最多隻有64個點blog
因此咱們只須要暴力求出每個點的座標,再枚舉你所走的點的起點與終點(只往一個方向走連續的點確定是最優)token
判斷距離(從初始位置走到起點的距離再加上起點到終點的距離)是否小於t便可,求出一個最大值就是答案啊ci
#include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; ll x[70],y[70]; ll dis(ll x1,ll y1,ll x2,ll y2) { return abs(x1-x2)+abs(y1-y2); } int main() { ll ax,ay,bx,by,xs,ys,t; int cnt=0; cin>>x[0]>>y[0]>>ax>>ay>>bx>>by; cin>>xs>>ys>>t; while(x[cnt]-xs<t&&y[cnt]-ys<t){ cnt++; x[cnt]=x[cnt-1]*ax+bx; y[cnt]=y[cnt-1]*ay+by; } int ans=0; for(int i=0;i<=cnt;i++){ for(int j=i;j<=cnt;j++){ if(j-i+1<=ans) continue; ll temp=min(dis(x[i],y[i],xs,ys),dis(x[j],y[j],xs,ys)); temp+=dis(x[i],y[i],x[j],y[j]); if(temp<=t) ans=j-i+1; } } cout<<ans<<endl; return 0; }