ARC164A Ternary Decomposition

该文章讨论了一道编程竞赛题目,要求找到是否存在一个由3的幂组成的序列,其和等于给定的正整数n。文章介绍了可以通过构造序列和利用三进制表示来优化序列长度的方法,并提出解决方案依赖于n和k的差是否为偶数以及n的三进制位数之和now的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARC164A Ternary Decomposition

题目大意

给你两个正整数 n n n k k k,求是否存在一个序列 ( m 1 , m 2 , … , m k ) (m_1,m_2,\dots,m_k) (m1,m2,,mk),使得

n = 3 m 1 + 3 m 2 + ⋯ + 3 m k n=3^{m_1}+3^{m_2}+\cdots+3^{m_k} n=3m1+3m2++3mk

如果存在,就输出 Y e s Yes Yes;如果不存在,就输出 N o No No

t t t组数据。

1 ≤ t ≤ 1 0 5 , 1 ≤ k ≤ n ≤ 1 0 18 1\leq t\leq 10^5,1\leq k\leq n\leq 10^{18} 1t105,1kn1018


题解

显然,我们可以构造一个序列,序列中的 m m m值全部都为 0 0 0。如果满足 3 m 3^m 3m的和为 n n n,则序列的长度为 n n n

因为 3 t + 3 t + 3 t = 3 t + 1 3^t+3^t+3^t=3^{t+1} 3t+3t+3t=3t+1,所以对于序列中相同的三个数 m a , m b , m c m_a,m_b,m_c ma,mb,mc,可以将这三个数用 m a + 1 m_a+1 ma+1替换。这样的话,序列的长度就减少了 2 2 2

我们可以进行多次操作,那么序列长度就可以减少多次 2 2 2。那么,最多可以减少多少次呢?

我们可以将 n n n表示为三进制的形式,如果对于每一个 i i i,值为 i i i m m m的个数和 n n n的三进制的第 i i i位的数相同,则此时没有一个 m m m值存在了三次,就不能减 2 2 2了。也就是说,设 n o w now now表示 n n n的三进制数中各位数的和,则序列长度不可能小于 n o w now now

那么,如果存在,那一定要满足两个条件:

  • n n n k k k的差为偶数
  • k ≥ n o w k\geq now know

那么,这道题就解决了。

code

#include<bits/stdc++.h>
using namespace std;
int t,now;
long long n,k;
int gt(long long x){
	int re=0;
	while(x){
		re+=x%3;x/=3;
	}
	return re;
}
int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&n,&k);
		now=gt(n);
		if(now<=k&&(n-k)%2==0) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值