Codeforces Round #729 (Div. 2) B. Plus and Multiply(有意思的构造)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #729 (Div. 2) B. Plus and Multiply(有意思的构造)相关的知识,希望对你有一定的参考价值。
题意
定义一个无限集合,首先 1 1 1在集合中
Ⅰ.若元素 x x x在集合中,那么 x ∗ a x*a x∗a在集合中
Ⅱ.若元素 x x x在集合中,那么 x + b x+b x+b在集合中
给定 n , a , b n,a,b n,a,b,问 n n n是否在参数为 a , b a,b a,b的无限集合中
毫无疑问,这题的难度远超 d i v 2 D \\rm div2D div2D的难度
让我们慢慢分析…
考虑为了凑成 n n n,共执行 z z z次操作Ⅰ,
设第 i i i次执行操作Ⅰ后连续执行了 k i k_i ki次操作二
得到
n = ∑ i = 0 z k i ∗ b ∗ a i + a z n=\\sum\\limits_{i=0}^{z} k_i*b*a^i+a^z n=i=0∑zki∗b∗ai+az
其中 z , k i z,k_i z,ki是 [ 0 , inf ] [0,\\inf] [0,inf]中的任意数
发现 a z a^z az增长的会非常快,考虑枚举 z z z得到
n − a z = ∑ i = 0 z k i ∗ b ∗ a i n-a^z=\\sum\\limits_{i=0}^zk_i*b*a^i n−az=i=0∑zki∗b∗ai
发现此时 n − a z n-a^z n−az模 b b b一定为零
而且我们可以证明,只要满足上述条件,就一定能找到一组正确的 k i k_i ki解
因为可以构造一组这样的解
k i = { n − a z b i=0 0 i!=0 k_i= \\begin{cases} \\frac{n-a^z}{b}& \\text{i=0}\\\\ 0& \\text{i!=0}\\\\ \\end{cases} ki={bn−az0i=0i!=0
所以枚举 z z z即可得到解,特判 a = 1 a=1 a=1的情况即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
signed main()
{
int t; cin >> t;
while( t-- )
{
cin >> n >> a >> b;
if( a==1 )
{
if( (n-1)%b==0 ) cout << "YES\\n";
else cout << "No\\n";
continue;
}
int az = 1, flag = 0;
for(int i=1;;i++)
{
if( az>n ) break;
if( (n-az)%b==0 ) flag = 1;
az = az*a;
}
if( flag ) cout << "Yes\\n";
else cout << "No\\n";
}
}
以上是关于Codeforces Round #729 (Div. 2) B. Plus and Multiply(有意思的构造)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #729 (Div. 2)
Codeforces Round #729 div.2 A-E题解
Codeforces Round #729 div.2 A-E题解
Codeforces Round #729 (Div. 2) C(数学)