トピック出典:http://codeforces.com/contest/1293/problem/D
参照範囲
AXおよびAYは2以上の正の整数大きく、それは、理由約1E18 2 ^ 60で、数は60を超えない^ 59> 1E16 2 ^ 60-2より桁数が理解されると、タイトルがTよりも大きくなければなりません、計算されていないを意味します。
あなたは最初にすべての貴重なポイントを見つけることができます。彼が収集したポイントの私の最大数に[i]は、DP DPた、すべての誤解ポイントXSでポイントをソート差のYSに入った後、アイデアはないリニア、明らかなエラーを持っていますが、地域、慎重に遠いポイントプラス1はエラーになりますDP点として、多くの周りの距離を考えると、ステータスが不正(データラボでエラーが発生した理由を、私は後で注意を引くために、知らないプロセス)があります。
Xので[I] =(X [I-1])* AX + BX、および線形関数が増加していると見ることができます。ちょうどANSを維持し、yは正の整数で共感、その上の点と終了点の減算を開始するの範囲を列挙し始めます。
しかし、J I-開始点と終了点から開始点と終了点XS、の小さい方の選択であるYS距離を決定する必要性が一定です。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<map>
#include<algorithm>
#include<queue>
#define MAX_len 50100*4
using namespace std;
typedef long long ll;
struct A {
ll x,y;
}a[110];
ll js(ll a,ll b,ll x,ll y)
{
return abs(a-x)+abs(b-y);
}
main()
{
ll x0,y0,ax,ay,bx,by;
ll xs,ys,t;
cin>>x0>>y0>>ax>>ay>>bx>>by;
cin>>xs>>ys>>t;
ll i,j;
ll len;
len=1;
a[len].x=x0;
a[len++].y=y0;
while(1)
{
x0=ax*x0+bx;
y0=ay*y0+by;
if(x0-xs+y0-ys>t)
break;
a[len].x=x0;
a[len++].y=y0;
}
ll ans=0;
for(i=1;i<len;i++)
{
for(j=i;j<len;j++)
{
ll dis=min(js(xs,ys,a[i].x,a[i].y),js(xs,ys,a[j].x,a[j].y));
dis+=js(a[i].x,a[i].y,a[j].x,a[j].y);
if(dis<=t)
ans=max(j-i+1,ans);
}
}
printf("%I64d",ans);
return 0;
}