ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1542B Plus and Multiply

2021-07-14 22:32:34  阅读:210  来源: 互联网

标签:CF1542B tmp int isdigit Plus Multiply include buf getchar


0x0 意:

给定正整数 \(a,b,n\),每次可以进行以下操作:

  • 把当前的数乘以 \(a\)
  • 把当前的数加上 \(b\)

假设你最开始有一个数 \(1\),求进行若干次操作后能否把这个数变成 \(n\)。


0x1 解:

经过若干次操作后,\(1\) 一定会变成 \(((1+p_1×b)×a^{q_1}+p_2×b)×a^{q_2}+ \cdots\) 的形式。

我们把 \(1\) 和所有的 \(b\) 拆出来,那么我们就得到了 \(p×b+a^q=n\),且 \(p,q\geq0\),枚举 \(q\) 判断是否符合要求即可。

特判掉 \(a=1\) 的情况 (因为枚举 \(q\) 会造成死循环)。


0x2 码:

少见的正常马蜂

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define int long long

inline int qread(){
	int tmp=0;char buf=getchar();bool f=true;
	while(!isdigit(buf)){if(buf=='-')f=false;buf=getchar();}
	while(isdigit(buf)){tmp=tmp*10+buf-'0';buf=getchar();}
	return f?tmp:-tmp;
}


bool chk(int nw,int div,int sub){
	if(div==1)return (nw-1)%sub==0;
	for(int i=1;i<=nw;i*=div){
		if((nw-i)%(sub)==0){
			return true;
		}
	}
	return false;
}


signed main(){
	int t=qread();
	while(t--){
		int n=qread(),a=qread(),b=qread();
		if(chk(n,a,b))puts("Yes");
		else puts("No");
	}
	return 0;
}

标签:CF1542B,tmp,int,isdigit,Plus,Multiply,include,buf,getchar
来源: https://www.cnblogs.com/XiEn1847/p/15013291.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有