P10026 「HCOI-R1」哀之变化

题目背景

哀喜欢数字。

她还喜欢变化。

题目描述

有一整数 aaa 初始为 111

哀想让 aaa 进行恰好 kkk 次变化,每次从以下两种变化中选择一个:

  • a←a−1a\gets a - 1aa1
  • a←a×2a\gets a \times 2aa×2

哀很好奇,经过 恰好 kkk 次变化后 aaa 能否变成 nnn

输入格式

本题有多组测试数据。

第一行,一个正整数 TTT,表示测试数据组数。

接下来 TTT 行,每行两个整数,依次为 kkknnn,表示哀的一次询问。

输出格式

TTT 行,对于每次询问,若 aaa 可以变成 nnn,输出 Yes,否则输出 No

输入输出样例 #1

输入 #1

3
2 5
2 4
3 3

输出 #1

No
Yes
Yes

输入输出样例 #2

输入 #2

5
4 869
48 69
8 328
66 114514
168 1919810

输出 #2

No
Yes
No
Yes
Yes

说明/提示

样例解释 1

  • k=2k = 2k=2n=5n = 5n=5,可以证明无解。
  • k=2k = 2k=2n=4n = 4n=4,一种可能的操作方式如下:
    • 第一步,a←a×2=2a \gets a\times 2 = 2aa×2=2
    • 第二步,a←a×2=4a \gets a\times 2 = 4aa×2=4
  • k=3k = 3k=3n=3n = 3n=3,一种可能的操作方式如下:
    • 第一步,a←a×2=2a \gets a\times 2 = 2aa×2=2
    • 第二步,a←a×2=4a \gets a\times 2 = 4aa×2=4
    • 第三步,a←a−1=3a \gets a-1 = 3aa1=3

数据规模与约定

本题采用捆绑测试。

  • Subtask 0(10 pts):T≤10T \leq 10T10k≤15k \leq 15k15
  • Subtask 1(25 pts):n,k≤2×103n, k \leq 2\times 10^3n,k2×103
  • Subtask 2(65 pts):无特殊限制。

对于所有数据,1≤T≤1051 \leq T \leq 10^51T1050≤n,k≤10180 \leq n, k \leq 10^{18}0n,k1018

C++实现

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T,k,n,res,ans;
inline ll Q(ll x){
    res=0;
    while(x!=1){
        if(x&1)
            x++;
        else
            x>>=1;
        res++;
    }
    return res;
}
inline bool check(ll x){
    if(x&1)
        x++;
    return (x&(-x))==x;
}
int main(){
    scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld",&k,&n);
        if(!k)
            puts(n==1?"Yes":"No");
        else if(!n)
            puts("Yes");
        else if(n==1)
            puts(k%2==0||k>=5&&k%2?"Yes":"No");
        else{
            ans=Q(n);
            puts(ans>k||ans+1==k&&check(n)?"No":"Yes");
        }
    }
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

更多推荐