周期问题答案

第1题     写数     时限:1s 空间:256m

小为为今年4岁,上幼儿园学会了写数,她只会从1写到100。今天老师给了她一张很大的白纸,小为为写数是从1开始写,一直写到100,然后又从1开始,一直写到100,不断重复这个过程。当小为为写完数后,老师数了一下,发现小为为总共在白纸上写下了N个数,那么小为为最后写的那个数是什么?

输入格式

一行,一个整数N。

对于100%的数据, 1 <= N <= 10000。


 

输出格式

一个整数。

输入/输出例子1

输入:

9

输出:

9

输入/输出例子2

输入:

103

输出:

3

作答区域

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
    cin>>n;
    if(n%100==0)cout<<100;
    else cout<<n%100;
    return 0;
}
 
第2题     找数字     时限:1s 空间:256m

有一列数,按5、6、2、4、5、6、2、4…排列,第n个是几?前n个数的和是多少? (n<=10000)

输入格式

一个整数n,表示要找的数的位置。(n<=10000)


 

输出格式

2个数

第一个数表示第n个数是几

第二个数表示前n个数的和是几


 

输入/输出例子1

输入:

5


 

输出:

5
22


 

作答区域

#include<bits/stdc++.h>
using namespace std;
long long x,s,n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(i%4==1)x=5;
        if(i%4==2)x=6;
        if(i%4==3)x=2;
        if(i%4==0)x=4;
        s=s+x;
    }
    cout<<x<<endl<<s;
    return 0;
}
第3题     游戏     时限:1s 空间:256m

今天是星期天,小楠楠来找你玩“石头、剪刀、布游戏”。你正在学习信息学,

所以想了一种需要编程来玩的“石头、剪刀、布游戏”。首先,用数字 1,2,3 分

别表示出石头、剪刀、布。其次,你确定自己前 N 次“石头、剪刀、布”的出拳

方法,下面 N 次再次同样出拳,…,周而复始;也要求楠楠确定他前 M 次的出拳

方法,然后周而复始。问第 K 次后,你赢了几次?

 例如:N=4,你的前 4 次出拳方式是“石头、剪刀、布、布”,用数字表示即:”1

2 3 3”。M=5,楠楠前 5 次出拳方式是“剪刀、石头、石头、布、布” ,用

数字表示即:2 1 1 3 3”。K=10 时,情况如下表:

图片.png

你共赢了 5 次。

输入格式

第一行 3 个整数 N,M,K。分别表示你出拳方式的周期长度、楠楠出拳方式的周

期长度和总共玩的次数。

第二行有 N 个整数,每个整数为 1、2、3 其中之一。

第三行有 M 个整数,每个整数为 1、2、3 其中之一。

输出格式

一个整数,表示 K 轮出拳后,你赢的次数。

输入/输出例子1

输入:

5 6 100

1 3 2 2 1

3 3 1 1 1 2

输出:

29

样例解释

数据范围: 

8 个数据: N,M 的范围是[1..100],K 的范围是[1…100,000]。

2 个数据: N,M 的范围是[1..100],K 的范围是[1…1,000,000,000]

(友情提示)整数数组开的太大(比如 30,000,000)可能会因超空间而得 0 分。

作答区域

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,a[105],b[105],s;
int main(){
    cin>>n>>m>>k;
    int t1=n,t2=m,t;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<m;i++)
        cin>>b[i];
    for(int i=0;i<n*m;i++)
    {
        int q=b[i%m]-a[i%n];
        if(q==1||a[i%n]==3&&b[i%m]==1)s++;
    }
    s=k/(n*m)*s;
    for(int i=0;i<k%(n*m);i++)
    {
        int q=b[i%m]-a[i%n];
        if(q==1||a[i%n]==3&&b[i%m]==1)s++;
    }
    cout<<s;
    return 0;
}

第4题     彩灯     时限:1s 空间:256m

校园中五彩缤纷的彩灯在夜幕降临时显的特别漂亮。晨晨发现原来这些看起来颜色杂乱的小灯是按照某种规律排列下去的,因为他数出红灯、红灯,蓝灯、红灯 、黄灯,红灯、红灯,蓝灯、红灯 、黄灯、……每5盏灯就会有一次重复这样的规律。好奇的晨晨很想知道N盏灯按这种规律排下去,会有多少盏红色的灯?于是他来找编程高手小Q,小Q告诉他,他的程序不仅能数出重复某种规律的N盏灯中多少盏红色的灯,而且可以数出晨晨想知道的任意一种颜色的灯数。你知道小Q是如何做到的吗?

输入格式

第一行有一个数M,表示每M盏灯就会有重复的规律。

第二行有M个数,表示M盏灯中每盏灯的颜色号。

第三行有两个数N和X,N表示校园中一共有N盏灯, X表示晨晨想计算的灯的颜色号。

输出格式

输出N盏灯中一共有多少盏是X号颜色的灯。

输入/输出例子1

输入:

5

1 5 2 5 3

12 3

输出:

2

样例解释

按每5盏灯一重复的规律,排12盏灯的颜色如下:

1  5  2  5  3  1  5  2  5  3  1  5

其中3号色的灯一共有两盏。

作答区域

#include<bits/stdc++.h>
using namespace std;
long long n,x,a[200],m,s,z;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    cin>>x>>m;
    for(int i=1;i<=n;i++)
        if(a[i]==m)s++;
    z=x/n*s;
    for(int i=1;i<=x%n;i++)
        if(a[i]==m)z++;
    cout<<z;
    return 0;
}
 
第5题     复制     时限:5s 空间:256m

有一个数组a[1...n],你把数组复制10^100次,然后把他们从左往右串在一起排成一行,就可以得到一个巨长的数组。求最小的下标k, 使得a[1]+a[2]+....a[k] >= X。

输入格式

第一行,两个整数:n和X。1<=n<=100000,  1<=X<=10^18。

第二行,n个整数,第i个整数是a[i]。1<=a[i]<=10^9。

输出格式

一个整数。

输入/输出例子1

输入:

3  26

3  5  2

输出:

8

样例解释

把数组a复制10^100次后,得到{3,5,2,3,5,2,3,5,2,3,5,2,.....},可以发现前8个数的和刚好超过26。

作答区域

#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],x,z,s,m;
int main(){
    cin>>n>>x;
    for(int i=0;i<n;i++)
    cin>>a[i],z+=a[i];
    s=(x/z*n);
    x=x-x/z*z;
    for(int i=0;i<x;i++)
    {
        m+=a[i];
        s++;
        if(m>=x)break;
    }
    cout<<s;
    return 0;
}

 
第6题     更多闰年数     时限:1s 空间:256m

输入两个正整数 a 和 b,表示开始的年份和结束的年份,问从 a 年到 b 年有多少 闰年?闰年只需要满足如下两个条件之一: 1、能整除 400。 2、能整除 4,但不能整除 100。

输入格式

第一行 2 个整数 a 和 b,范围在[1, 1000000000]。

输出格式

一个整数。


 

输入/输出例子1

输入:

1 10000


 

输出:

2425

作答区域

#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main(){
    cin>>a>>b;
    cout<<(b/4-b/100+b/400)-((a-1)/4-(a-1)/100+(a-1)/400);
    return 0;
}

 
第7题     游泳     时限:1s 空间:256m

三个人在游泳,第0分钟他们都在泳池最左侧,之后他们来回游,游一个来回分别需要a,b,c分钟,你在第p分钟到达泳池最左侧,请问至少还要等多少分钟,才能看见有人到达泳池最左侧。

输入格式

四个整数,p,a,b,c(1<=p,a,b,c<=10^18)。

输出格式

一个整数表示答案。

输入/输出例子1

输入:

9 5 4 8

输出:

1

输入/输出例子2

输入:

2 6 10 9

输出:

4

输入/输出例子3

输入:

10 2 5 10

输出:

0

作答区域

#include<bits/stdc++.h>
using namespace std;
long long a,b,c,aa,bb,cc,n,p;
int main(){
    scanf("%lld%lld%lld%lld",&p,&a,&b,&c);
    aa=(a-(p%a))%a;
    bb=(b-(p%b))%b;
    cc=(c-(p%c))%c;
    n=min(aa,min(bb,cc));
    printf("%lld",n);
    return 0;
}

 
第8题     盒子染色     时限:1s 空间:256m

从左往右有n个白色的盒子,编号是1至n。

如果盒子的编号是4的倍数,那么就把这个盒子染色黑色。

请问编号a到编号b这一段盒子中,总共有多少个盒子被染成黑色?

输入格式

一行3个整数n,a,b(a<=n , b<=n , n<=10^12)。

输出格式

一个整数。

输入/输出例子1

输入:

100  2   5

输出:

1

输入/输出例子2

输入:

100 100 1

输出:

25

作答区域

#include<bits/stdc++.h>
using namespace std;
long long n,n1,n2;
int main(){
    cin>>n>>n1>>n2;
    if(n1>n2)swap(n1,n2);
    cout<<(n2/4)-((n1-1)/4);
    return 0;
}

 
第9题     幸运奶牛     时限:1s 空间:256m

有 N 头奶牛从左往右排成一行,编号是 1 至 N。如果某头奶牛的编号是 2 的倍数 或者是 3的倍数,那么这头奶牛就是幸运奶牛。现在Peter随便报了两个不大于N的正整数a和b,问你编号a~b的奶牛中,总共有多少头奶牛是幸运奶牛?

输入格式

一行,3个整数a,b, N(a<=b<=N<=2*10^12)。

输出格式

一行,一个整数,表示幸运奶牛的数量。

输入/输出例子1

输入:

2  9  10

输出:

6

输入/输出例子2

输入:

6   18  20

输出:

9

样例解释

编号是:2,3,4,6,8,9 的奶牛都是幸运奶牛。

作答区域

#include<bits/stdc++.h>
using namespace std;
long long a,b,n;
int main(){
    cin>>a>>b>>n;
    cout<<(b/2+b/3-b/6)-((a-1)/2+(a-1)/3-(a-1)/6);
    return 0;
}

 
第10题     幸运奶牛2     时限:1s 空间:256m

有 N 头奶牛从左往右排成一行,编号是 1 至 N。如果某头奶牛的编号是 a 的倍数 或者是 b的倍数,那么这头奶牛就是幸运奶牛。现在Peter随便报了两个不大于N的正整数S和T,问你编号S~T的奶牛中,总共有多少头奶牛是幸运奶牛?

输入格式

一行,5个整数a,b, N,S,T(2<a<=b<=1000 , 1<=S<=T<=N <=2*10^12)。

输出格式

一行,一个整数,表示幸运奶牛的数量。

输入/输出例子1

输入:

2  3  10  2  9

输出:

6

样例解释

编号是:2,3,4,6,8,9 的奶牛都是幸运奶牛。

作答区域

#include<bits/stdc++.h>
using namespace std;
long long a,b,n,t1,t2;
int main(){
    cin>>a>>b>>n>>t1>>t2;
    cout<<(t2/a+t2/b-t2/(a*b))-((t1-1)/a+(t1-1)/b-(t1-1)/(a*b));
    return 0;
}

 
第11题     彩灯2     时限:1s 空间:256m

校园中五彩缤纷的彩灯在夜幕降临时显的特别漂亮。晨晨发现原来这些看起来颜色杂乱的小灯是按照某种规律排列下去的,因为他数出红灯、红灯,蓝灯、红灯 、黄灯,红灯、红灯,蓝灯、红灯 、黄灯、……每5盏灯就会有一次重复这样的规律。好奇的晨晨很想知道N盏灯按这种规律排下去,其中一段灯会有多少盏红色的灯?于是他来找编程高手小Q,小Q告诉他,他的程序不仅能数出重复某种规律的N盏灯中多少盏红色的灯,而且可以数出晨晨想知道的任意一种颜色的灯数。你知道小Q是如何做到的吗?

输入格式

第一行有一个数M,表示每M盏灯就会有重复的规律。

第二行有M个数,表示M盏灯中每盏灯的颜色号。

第三行有两个数N和X,N表示校园中一共有N盏灯, X表示晨晨想计算的灯的颜色号。

第四行有两个数S,T,表示要求的连续一段灯。

(1<=X<=5,1<=M<=10,1<=S<=T<=N<=20000000000)

输出格式

输出N盏灯中,第S~第T盏灯中一共有多少盏是X号颜色的灯。

输入/输出例子1

输入:

5

1 5 2 5 3

12 3

1  10

输出:

2

样例解释

按每5盏灯一重复的规律,排12盏灯的颜色如下:

1  5  2  5  3  1  5  2  5  3  1  5

第1盏~第10盏灯中,3号色的灯一共有2盏。

作答区域

#include<bits/stdc++.h>
using namespace std;
long long n,x,a[200],m,s,z,a1,b1;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    cin>>x>>m>>a1>>b1;
    for(int i=1;i<=n;i++)
        if(a[i]==m)s++;
    z=(b1/n*s)-((a1-1)/n*s);
    for(int i=1;i<=(a1-1)%n;i++)
        if(a[i]==m)z--;
    for(int i=b1%n;i>=1;i--)
        if(a[i]==m)z++;
    cout<<z;
    return 0;
}

 
第12题     手机号码     时限:1s 空间:256m

奶牛Bessie最近买了一台手机,它的手机号码是:13300303003,手机号码由11个数字组成。Bessie最近在上电脑课学了【复制】和【粘贴】,于是它打开word软件,把它的手机号码复制,然后粘贴了N次。例如N=1时,是这样:13300303003 。又例如N=2时,是这样:1330030300313300303003。 再例如N=3时,是这样:133003030031330030300313300303003。 如果N=4,会是这样:13300303003133003030031330030300313300303003。 现在给出了三个正整数:N,S,T。表示奶牛Bessie把它的手机号码复制粘贴了N次,然后奶牛要计算:第S个数字到第T个数字之间,有多少个数字3(包含第S个数字和第T个数字)?由于奶牛Bessie复制粘贴N次手机号码后已经眼花了,所以它希望你能写个程序来帮它计算,你能做到吗?


 

输入格式

一行,三个正整数: N,S,T

对于50%的数据, 1<=N<=1000, 1 <= S < T <= 11×N

对于100%的数据, 1<=N<=100000000, 1 <= S < T <= 11×N


 

输出格式

一个整数,表示Bessie把手机号码复制粘贴N次后,第S个数字到第T个数字之间包含了多少个数字3(包含第S个数字和第T个数字)。


 

输入/输出例子1

输入:

1 2 11

输出:

5

输入/输出例子2

输入:

1 1 5

输出:

2

作答区域

 
#include <cstdio>
using namespace std;
char str[15]="013300303003";
int n,s,t;
int lIndex,x,l,r;
long long ans=0;
int main() {
    scanf("%d%d%d",&n,&s,&t);
    lIndex=(s-1)/11;
    if(s%11==1)l=-1;
    else 
    {
        if(s%11==0)l=11;            
        else l=s%11;
    }
    x=t/11;
    if(t%11==0)r=-1;
    else r=t%11;
    for (int i=1;i<l;i++)
        if (str[i]=='3')ans--;
    for (int i=1;i<=r;i++)
        if (str[i]=='3')ans++;
    ans+=(x-lIndex)*5;
    printf("%lld",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值