找规律
题目大意
给定 ,求按照题目给定的操作,至少多少次才会有
个
。
解法
找规律,先来看看一次操作(这里的操作是指对整个文本框都复制), 的个数就变成了
个,两次操作后,
的个数变成了
个,我们不妨可以推理一下,对于整个文本框都复制的情况下,个数是由
的次方增长的,比如第
次此操作后,
的个数变成了
次方个。
而题目中要求是 个,不是求比
大时的次数,是不是上面的规律就没用了吗?
注意题目中的一小段:
部分或全部
假设 是距离
最近的
次方的数,那么我们只需要在文本框中找到
个字符复制出来即可,所以问题就转变成找到最小的比
大的
次方的数。
我们只需要预处理出 次方的数(在
),然后再跑一遍即可
展示代码:
//
#include <bits/stdc++.h>
#define ll long long
#define LM LLONG_MAX
#define IM INT_MAX
#define IMN INT_MIN
#define LMN LLONG_MIN
#define tr true
#define fa false
using namespace std;
const int Maxn = 1e2 + 1;
int ans[Maxn];
ll n, t;
int main(){
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
ans[0] = 1;
for(int i = 1; i <= Maxn; i++){
ans[i] = ans[i - 1] * 2;
}
cin >> t;
while(t--){
cin >> n;
for(int i = 0; i <= Maxn; i++){
if(ans[i] >= n){
cout << i << endl;
break;
}
}
}
return 0;
}
如有错误,请指出,谢谢🙏