题目描述
你有两个数a和b,其中a等于0,b等于1,你有2种操作:
操作一:你可以选择a的值加上b或b的值加上a。
操作二:你可以选择a或b乘以数字x。
请你输出一个操作次数不超过400次的操作序列,使得a或b中有一个值等于n。
其中x和n的值为给定的。
输入格式
第一行输入一个整数 1≤T≤200,代表有T组样例。
随后T行输入两个整数n,x,分别代表0≤n≤1e9 2≤x≤10。
输出格式
对于每一组样例
首先输出一行kkk,代表你操作的总次数,k≤400k\leq 400k≤400。
随后kkk行,每行输出一个整数和一个字符。
(其中输出的整数应为111或222代表选择的操作,输出的字符应为aaa或bbb)。
即:
1 a:代表选择a的值加上b
1 b:代表选择b的值加上b
2 a:代表选择a的值乘以x
2 b:代表选择b的值乘以x
思路:构造一种方法,用进制分解的思路,将n转换为x进制的数
m位x进制数转换为10进制公式为:,a[i]表示x进制数的第i位
所以将十进制n转换为x进制的过程用题目要求的步骤表示即可
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define NOTLE ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define T int TT;cin >> TT;while (TT--)
#define lint long long
#define pb push_back
int n,x;
int main(){
NOTLE;
T{
cin >> n >> x;
vector<string> ans;
while(n){
//十进制n转x进制,除x取余,倒序输出
int y=n%x;
for(int i=1;i<=y;++i)
ans.pb("1 a");
n/=x;
if(n) ans.pb("2 b");
}
cout << ans.size() << endl;
for(auto i:ans) cout << i << endl;
}
return 0;
}