1 条题解

  • 0
    @ 2026-1-27 19:42:51
    //解题思路:容易发现,对于所有n都一定能表示出来,最坏的情况都是3的0次方,不过不一定是k个数。那我们可以求出最
    //少和最多用多少个数表示,再看看能否累加或减少到k个 ,问题转变成最少的次数怎么求?
    //我们需要让n一直/3,每一次的余数就是组成当前数字需要的最少操作步数,例如7%3=1,那么至少需要操作一次 
    //7/3=2,2%3,那么最少需要操作两次,整合一次,至少需要操作3次。
    //我们已经知道了最大操作次数与最小操作次数,万一k在他们中间如何判断是否可以? 
    #include <bits/stdc++.h>  
    using namespace std;     
    int t; 
    int main() {
        int t; 
        cin>>t; 
        while (t--) {
            long long n,k;
            cin>>n>>k;  
            
            //例如 7=3*2+1,那么7最少需要3个数字组成 
            long long num=0;  // num-记录最少需要多少次操作
            
            // 这个循环把数字n转换成三进制,并计算各位数字的和
            while (n) {
                num+=n%3;  // 获取当前组成数字所需要的数字数量 
                n /= 3;        // 把n除以3,相当于去掉已经处理过的最低位
            }
    
            // 情况1:如果最少需要的操作次数都比k多,那肯定做不到
            if (num>k)
                puts("No");    
                
            // 情况2:如果多出来的操作次数是偶数,那就可以做到,为什么可以做到呢?num是我们求出来的最少操作次数,那么这个最少操作次数
    		//一定是可以拆分的,3^i = 3^(i-1) +  3^(i-1) + 3^(i-1);每一次会多出来两个数字,最坏的情况,所有的数字都拆成3的0次方
    		//所以只要剩余的操作次数为偶数,就一定可以拆分 
            else if ((k-num)%2== 0)
                puts("Yes");   
                
            // 情况3:如果多出来的操作次数是奇数,那也做不到
            else
                puts("No"); 
        }
        return 0; 
    }
    
    • 1

    信息

    ID
    1379
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者