这样做对吗?
查看原帖
这样做对吗?
735797
XingnoYi楼主2024/3/18 21:43

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;
}
2024/3/18 21:43
加载中...