rt,思路是处理出所有的数据点,然后贪心每次找最近的点,WA on #44
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e4 + 5;
int xz,yz,ax,ay,bx,by;
int xs,ys,t;
int ans = 0;
int cnt = 0;
struct node{
int x;
int y;
bool vis = 0;
}node[N];
struct node1{
int x;
int y;
int num;
int id;
};
inline void read(int &x)
{
x = 0;
int f = 1;
char ch = getchar();
while(!isdigit(ch)){if(ch == '-') f = -f;ch = getchar();}
while(isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48),ch = getchar();
x *= f;
}
inline void write(int x)
{
if(x < 0) x = -x,putchar('-');
int sta[35],top = 0;
do
{
sta[++top] = x % 10,x /= 10;
}while(x);
while(top) putchar(sta[top--] ^ 48);
}
inline int Abs(int x)
{
return x > 0 ? x : -x;
}
inline int cal(int x,int y,int gx,int gy){
return Abs(x - gx) + Abs(y - gy);
}
signed main()
{
read(xz),read(yz),read(ax),read(ay),read(bx),read(by);
read(xs),read(ys),read(t);
for(int x = xz,y = yz;x <= 1e17 && y <= 1e17;x = ax * x + bx,y = ay * y + by) node[++cnt].x = x,node[cnt].y = y,node[cnt].vis = 0;
int x = xs,y = ys;
while(t > 0)
{
node1 minn = {0,0,(long long)1e18,0};
for(int i = 1;i <= cnt;i++)
{
if(node[i].vis) continue;
if(minn.num > cal(x,y,node[i].x,node[i].y)) minn.num = cal(x,y,node[i].x,node[i].y),minn.x = node[i].x,minn.y = node[i].y,minn.id = i;
}
if(t < minn.num) break;
x = minn.x;y = minn.y;t -= minn.num;ans++;node[minn.id].vis = 1;
}
write(ans);
}