问题标题: 酷町堂:1148!急!!!

0
0
已解决
徐子宸
徐子宸
中级天翼
中级天翼

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发思路

急!!!


0
已采纳
江齐悦
江齐悦
高级光能
高级光能

这位大佬您好!

以下是主函数代码,还有一些自己想一想,不行的话在评论区跟我说。

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;
    }
}

最后,望采纳,谢谢

0
我要回答