0628Zn

有点意思

题目描述
有一个按照以下规则生成的无限集

规则一:\(1\)在集合中
规则二:若\(x\)在集合中,那么\(a\cdot x\)以及\(b+x\)在集合中

每次询问数\(n\)是否在集合中

输入格式
第一行一个数\(t\)表述测试组数
之后\(t\)行,每行三个数分别表述\(n,a,b\).

输出格式
\(t\)行,每一行输出Yes和No表示答案

数据范围
\(t\le500,1\le a,b,n\le10^9\)

易证:\(\forall x\in S,x=a^{k_1}+k_2 b.k_1,k_2\in N\)
无论是乘\(a\)还是加\(b\)都只是在改变\(b\)的系数而已
所以我们只需要枚举\(k_1\),判断是否能找到满足条件的\(k_2\),及判断\(b\mid(n-a^{k_1})\)是否成立即可。
不要忘记特判\(a=1\)的情况,复杂度\(\Theta(t\log_a n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
long long T,n,a,b;
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld %lld %lld",&n,&a,&b);
		if(n%b==1||b==1)
		{
			printf("Yes\n");
			continue;
		}
		else if(a==1)
		{
			printf("No\n");
			continue;
		}
		bool flag=0;
		for(long long i=0,j=1;j<=n&&!flag;i++,j*=a)
			if((n-j)%b==0)
				flag=1;
		if(flag)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

posted on 2025-08-28 16:50  琬安与璃茗  阅读(8)  评论(0)    收藏  举报