P10252 WA 求助
  • 板块灌水区
  • 楼主XingnoYi
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/3/19 20:36
  • 上次更新2024/3/19 22:15:53
查看原帖
P10252 WA 求助
735797
XingnoYi楼主2024/3/19 20:36

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;
}
2024/3/19 20:36
加载中...