WA 了后三个点。
具体思路是每次变换和上次值只差为等比数列,通过公式判断查找等于 0 时的情况(的指数幂),求出答案。
#include <iostream>
#include <cmath>
#define big long long
using namespace std;
big T;
big x,a,b;
big ksm(big x,big y)
{
big c=x;
big ans=1;
while(y > 0)
{
if(y & 1)
{
ans = ans*c;
}
c = c*c;
y >>= 1;
}
return ans;
}
int main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld",&x,&a,&b);
if((x*a-b > x) || (x < 0))
{
printf("%lld\n",x);
continue;
}
if(a*x-b < 0)
{
printf("%lld\n",a*x-b);
continue;
}
if(a == 1)
{
big t = ceil(x*1.0/b);
printf("%lld\n",x-t*b);
continue;
}
big dx;
dx = x-(a*x-b);
if(x == 0 || a == 0)
{
printf("%lld\n",-b);
continue;
}
double t = x*1.0/dx;
t = t*(a-1);
t = t+1;
double n = log(t)/log(a);
big c = ceil(n);
printf("%lld\n",x-(ksm(a,c)-1)/(a-1)*dx);
}
return 0;
}