打卡信奥刷题(3400)用C++实现信奥题 P10026 「HCOI-R1」哀之变化
·
P10026 「HCOI-R1」哀之变化
题目背景
哀喜欢数字。
她还喜欢变化。
题目描述
有一整数 aaa 初始为 111。
哀想让 aaa 进行恰好 kkk 次变化,每次从以下两种变化中选择一个:
- a←a−1a\gets a - 1a←a−1;
- a←a×2a\gets a \times 2a←a×2。
哀很好奇,经过 恰好 kkk 次变化后 aaa 能否变成 nnn。
输入格式
本题有多组测试数据。
第一行,一个正整数 TTT,表示测试数据组数。
接下来 TTT 行,每行两个整数,依次为 kkk 和 nnn,表示哀的一次询问。
输出格式
共 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=2,n=5n = 5n=5,可以证明无解。
- 若 k=2k = 2k=2,n=4n = 4n=4,一种可能的操作方式如下:
- 第一步,a←a×2=2a \gets a\times 2 = 2a←a×2=2;
- 第二步,a←a×2=4a \gets a\times 2 = 4a←a×2=4。
- 若 k=3k = 3k=3,n=3n = 3n=3,一种可能的操作方式如下:
- 第一步,a←a×2=2a \gets a\times 2 = 2a←a×2=2;
- 第二步,a←a×2=4a \gets a\times 2 = 4a←a×2=4。
- 第三步,a←a−1=3a \gets a-1 = 3a←a−1=3。
数据规模与约定
本题采用捆绑测试。
- Subtask 0(10 pts):T≤10T \leq 10T≤10,k≤15k \leq 15k≤15。
- Subtask 1(25 pts):n,k≤2×103n, k \leq 2\times 10^3n,k≤2×103。
- Subtask 2(65 pts):无特殊限制。
对于所有数据,1≤T≤1051 \leq T \leq 10^51≤T≤105,0≤n,k≤10180 \leq n, k \leq 10^{18}0≤n,k≤1018。
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐
所有评论(0)