WA 了三个点。
具体思路是每次变换和上次值只差为等比数列,通过公式判断查找等于 0 时的情况(的指数幂),求出答案。
#include <iostream>
#include <cmath>
#define big long long
using namespace std;
big T;
big x,a,b;
int pw(big x,big y)
{
big ans;
if(y == 1)
{
return x;
}
else if(y == 0)
{
return 1;
}
if(y % 2 == 0)
{
ans = pw(x,y/2);
return (ans*ans);
}
else
{
ans = pw(x,y/2);
return (ans*ans)*a;
}
}
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);
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-(pw(a,c)-1)/(a-1)*dx);
}
return 0;
}