中级天翼
1148 奇妙变换(magic)经验值:1600
不许抄袭,一旦发现,直接清空经验!
题目描述 Description
为了奖励牛牛同学帮妈妈解决了大写中文数字的问题,牛牛妈妈特地抽出一个周末的时间带着牛牛来到梦幻儿童乐园游玩。
在游乐园,牛牛看到了一个非常有意思的游戏:游戏一开始,电脑屏幕上只有一个序列“A”,而后的每一次变化都把序列中的“A”变成“AB”,“B”变成“A”。游戏一直继续……,最后屏幕上得到了序列“ABAABABAABAABABAABA……”。当然更有意思的是,电脑会提出Q个询问,每次询问:在第m个字符和第n个字符之间有多少个“A”(包括第m、n个字符在内)。
你能帮牛牛解决这个问题吗?
输入描述 Input Description
第一行为一个整数Q,后面有Q行,每行两个数用空格隔开的整数m,n。
输出描述 Output Description
共Q行,每行一个回答。
样例输入 Sample Input
1 2 8
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
【数据范围】
1≤Q≤5000
1≤m≤n≤2^63
保证每次询问时,所询问的区间已经生成。
#include<bits/stdc++.h>
using namespace std;
string s[1000];
int main() {
s[0]="A";
s[1]="AB";
for(long long i=2;i<100;i++){
s[i]=s[i-1]+s[i-2];
}
int q;
cin>>q;
while(q--){
long long n,m,c,cnt=0;
string s1;
cin>>n>>m;
for(long long i=0;i<100;i++){
if(s[i].size()==m){
s1=s[i];
break;
}else if(s[i].size()>m){
s1=s[i];
break;
}
}
for(long long i=n;i<=m;i++){
if(s1[i]=='A'){
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}
改错or发思路
急!!!
高级光能
这位大佬您好!
以下是主函数代码,还有一些自己想一想,不行的话在评论区跟我说。
int main(){ len[1]=1,len[2]=2; a[1]=a[2]=1; for(int i=3;i<=91;i++) { len[i]=len[i-1]+len[i-2]; a[i]=a[i-1]+a[i-2]; } cin>>q; while(q--){ cin>>m>>n; cout<<cal(n,91)-cal(m-1,91)<<endl; } }
最后,望采纳,谢谢