- 题解
《10.3训练赛》题解
- 2022-10-4 0:33:09 @
A 嘴硬的圈圈
圈圈今天开始上小学,他的老师教他加法,但圈圈不听,他告诉老师,加法他早就会了(嘴硬),而他的老师特别聪明,一看就看出了圈圈在嘴硬,于是他给圈圈留了加法作业来考圈圈,圈圈发现自己不会写,于是向聪明的你求助,希望你能帮他继续嘴硬下去。 老师首先告诉了圈圈,接下来他会给圈圈T道题,然后每道题目有两个数a和b,希望圈圈能回答出来a+b的值。
Input
第一行给定一个整数T()。
接下来T行,每行两个整数a, b(a,b均在int范围内)。
Output
输出T行,每行一个整数。
Samples
输入数据 1
1
1 1
输出数据 1
2
代码(查无此人)
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
long long a,b;
for(int i = 0 ; i < T ; i++)
{
scanf("%lld %lld",&a,&b);
printf("%lld\n",a+b);
}
return 0;
}
B wulong拿着他的小风车
wulong今天想去参加acm培训,但是他木得小车车,碰巧遇上了拥有小电驴的你,于是坐上了你的电动车后座。“giegie,你骑着小、小电动车带着我,你女朋友知道了,不会揍我吧?呜呜呜,你女朋友好可怕,不像我,我只会心疼giegie^-^“。 你边开车带着wulong,wulong一遍唱着歌“小风车 ,大西几。阿巴阿巴阿巴巴。大黄狗,小脑斧。嗷呜嗷呜嗷嗷呜!” 于是你顿生爱慕之心,决定打印出来wulong最喜欢的小风车告诉他,以后,你的小电驴后座只能坐他!
Description
输入一个N代表风车的边长,打印出来整个风车(详情见样例)
Format
Input
输入一个整数N(5≤N≤30),代表风车的边长
Output
输出整个风车
Samples
输入数据 1
5
输出数据 1
***** *
**** **
*** ***
** ****
***********
**** **
*** ***
** ****
* *****
输入数据 2
6
输出数据 2
****** *
***** **
**** ***
*** ****
** *****
*************
***** **
**** ***
*** ****
** *****
* ******
代码(XCCX---).
#include<stdio.h>
int main()
{
int n,i,j,k,l,p;
scanf("%d",&n);
for(i=1;i<=n-1;i++)
{
for(j=0;j<i;j++)
{
printf(" ");
}
for(k=0;k<n+1-i;k++)
{
printf("*");
}
for(l=0;l<n-i;l++)
{
printf(" ");
}
for(p=0;p<i;p++)
{
printf("*");
}
printf("\n");
}
for(i=0;i<2*n+1;i++)
{
printf("*");
}
printf("\n");
for(i=1;i<=n-1;i++)
{
for(j=0;j<n-i;j++)
{
printf("*");
}
for(k=0;k<i;k++)
{
printf(" ");
}
for(l=0;l<i+1;l++)
{
printf("*");
}
printf("\n");
}
return 0;
}
C 撒硬币的ZIFEI
ZIFEI今天感觉特别饿,回寝室抓了一把硬币就去地超买吃的了,进入地超的ZIFEI数了一下手里的硬币,没想到只有a个一块的和b个两块的(你问我为啥有两块的硬币?我也不知道,但就是有)。ZIFEI希望能够直接拿起吃的,洒出一把硬币就走(他觉得这样很帅)。但是他不想装*失败,于是他想知道他无法不找钱支付的最小价格是多少。
Input
第一行一个整数T(T<=100) 接下来T行,每行两个整数a,b(a,b均为int范围)
Output
每行一个整数,代表答案
Samples
输入数据 1
1
1 1
输出数据 1
4
代码(sup0)
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
long long a=0,b=0;
for(int i=1;i<=T;i++)
{
scanf("%lld%lld",&a,&b);
if(a==0)
printf("1\n");
else
printf("%lld\n",a+2*b+1);
}
}
D 睡前数羊的咩咩
咩咩今天卷了一整天的幸运九十九,躺在床上还在想没做出来的题,结果根本睡不着!但是为了赶上早八的课,咩咩决定数羊,但是她不想就那么简单的数羊,那样无法在睡觉的时候动脑子,于是她开始想,现在有一头羊,它每年年初就会生小羊,小羊从第四个年头开始,每年年初也能开始生小羊,那么第一年就有1头羊,第二年有2头羊,第三年有3头羊,第四年有4头羊,第五年有6头羊。。。。。咩咩睡着了,但她睡醒了之后又开始想问题了,如果到了第n年,那有几头羊了嘞?(假设羊长生不老,根本死不了)。
Input
第一行一个整数T,1≤T≤1e6 . 随后T行,每行一个整数n(1≤n≤400)
Output
每行一个整数,结果要对1e9+7取模
Samples
输入数据 1
2
1
2
输出数据 1
1
2
代码(wanan)
#include<stdio.h>
int main()
{
int T,n,i;
scanf("%d",&T);
long long int a[410];
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
for(i=5;i<=400;i++)
{
a[i]=a[i-1]%1000000007+a[i-3]%1000000007;
}
while(T--)
{
scanf("%d",&n);
printf("%lld\n",a[n]);
}
return 0;
}
E 爱学习的yq
超高校级のDreamer yq今天还在为了战胜绝望而努力学习着,今天的他学会了位运算(多么爱学习的yq!),学会位运算的yq立刻就有了个想法,(A + B) = (A | B)的情况会有多少个呢?当然,什么约束都没有的话,这个式子对于yq来说还是太难了,于是yq增加了一些约束条件,他只想知道当A, B 均小于 N 时的情况数(N为2的幂次方数)。 当然,(A=0,B=1)和(A=1,B=0)为不同情况哦。请你作为超高校级のacmer帮助他计算情况吧!
Input
输入一个整数M , 0≤M≤100 . N=2^M 注意,输入的是M,不是N哦
Output
输出一个整数代表答案(答案可能十分巨大,请对998244353取模)
Samples
输入数据 1
0
输出数据 1
1
输入数据 2
1
输出数据 2
3
代码(远月猫娘吃萝卜)
#include<stdio.h>
long long int a=3,b[400],c=0;
int main()
{
int n;
scanf("%d",&n);
if(n==0)
{
printf("1");
}else
{
for(;n>1;)
{
if(n%2==0)
{
a=(a*a)%998244353;
n/=2;
}
else
{
n-=1;
b[c]=a;
a=(a*a)%998244353;
n/=2;
c+=1;
}
}
for(int i=0;i<c;i++)
{
a=(a*b[i])%998244353;
}
printf("%lld",a);
}
return 0;
}
F 黑白熊 vs 超高校级のDreamer
唔噗噗噗噗,没想到啊,超高校级のDreamer,竟然你能走到这一步来。"黑白熊此时与yq在宇宙之中进行希望与绝望的终极一战。只见yq轻蔑一笑,从身后掏出了一个神奇的遥控器!"噢噢噢噢!竟然是可以控制一切机器的万能遥控器吗!"假设现在黑白熊位于xyz坐标系的(0,0,0)坐标,且头顶为z轴正方向,面朝x轴正方向,右边为y轴正方向,为了简单起见,我们分别对六个方向进行标号,x,y,z正方向分别为0,1,2,负方向分别为3,4,5,yq手上的万能遥控器共有以下几个命令:
1. f x 向面朝的方向走x米。
2. b x 先转向后,再走x米。
3. l x 先转向左,再走x米。
4. r x 先转向右,再走x米。
5. u x 先转向上,再走x米。
6. d x 先面向下,再走x米。
身为超高校级の希望的你为了协助yq击败黑白熊,在第一时间就已经知道了黑白熊接下来会被控制走到的位置以及面朝的方向,并在那里等待,请你输出你知道的黑白熊最终走到的位置和面朝的方向吧!
Input
第一行一个整数T,代表接下来yq会用遥控器执行T条命令 (1≤T≤10000) 接下来T行,每行一个字符(字符仅有命令中包含的字符)和一个整数x(1≤x≤100000),
Output
输入四个整数,前三个整数为当前黑白熊的坐标,最后一个整数代表当前黑白熊面朝的方向。
Samples
输入数据 1
1
r 100
输出数据 1
0 100 0 1
思路:该题核心是,这个人放在一个三维的空间里,他除了朝面部朝向的方向直走之外,向左向右向后亦或是向上向下改变方向行走,都会影响他的面朝向,左手朝向,以及头顶朝向这三个属性,而这三个属性决定了这个人下一次旋转再行走的绝对坐标,这样就必须,一直维护他的这三个属性,才能保证他每次换方向行走的绝对坐标无误,详解如下:
(1)首先初始化他的三个方向dire, left, upp。 dire为面部朝向;left为左手朝向(左手系);upp为头顶朝向,即初始化dire = 0, left = 4, upp= 2。
(2)然后研究他每次转动后他的三个属性朝向与转动前的联系:
i)向后转(b):头顶朝向不变,面朝向变为原面部朝向的逆,即原背部朝向,左手朝向变为原左手朝向的逆,即原右手朝向。
ps:处理手法,该题定义x, y, z轴的正方向为0, 1, 2,负方向为 3,4, 5,观察发现正负方向差值为3,所以可以用(p+3)% 6来改换为逆向,其中p为原来的方向。
ii) 向左转(l):头顶朝向不变,面部朝向变为原左手朝向,左手朝向变为原面部朝向的逆向,即原背部朝向。
iii) 向右转(r):头顶朝向不变,左手朝向变为原面部朝向,面部朝向变为原左手朝向的逆,即原右手朝向。
iv) 向上转(u):左手朝向不变,头顶朝向变为原面部朝向的逆,面部朝向变为原头顶朝向。
v) 向下转(d):左手朝向不变,头顶朝向变为原面部朝向,面部朝向变为原头顶朝向的逆。
代码(fytftyf)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
char ch;
int ans;
long long x = 0, y = 0, z = 0;
int dire=0,left = 4, upp = 2;
while (t--)
{
cin >> ch >> ans;
if (ch == 'f')
{
dire = dire;
}
if (ch == 'b')
{
dire = (dire + 3) % 6;
left = (left + 3) % 6;
}
if (ch == 'l')
{
int cnt = dire;
dire = left;
left = (cnt + 3) % 6;
}
if (ch == 'r')
{
int cnt = dire;
dire = (left + 3) % 6;
left = cnt;
}
if (ch == 'u')
{
int cnt = dire;
dire = upp;
upp = (cnt + 3) % 6;
}
if (ch == 'd')
{
int cnt = dire;
dire = (upp + 3) % 6;
upp = cnt;
}
if (dire == 0)
{
x += ans;
}
if (dire == 1)
{
y += ans;
}
if (dire == 2)
{
z += ans;
}
if (dire == 3)
{
x -= ans;
}
if (dire == 4)
{
y -= ans;
}
if (dire == 5)
{
z -= ans;
}
}
printf("%lld %lld %lld %d\n", x, y, z, dire);
return 0;
}
G 小a数
今天a_palpitate学了cry数,觉得cry数也太简单了吧(什么?你不知道什么是cry数?如果一个数是素数,且他的每一位都是素数,则这个数是cry数),于是!小a同学决定发明一种数,叫小a数,小a数的定义是这样的,如果一个数n是cry数,或者他是一个个位数,则小a数为n^n,如果都不是,则这个数先变成各位数之和,再次进行以上判断,现在小a同学一脸得意的站在你面前,他想问你是否他任意说出一个数,你都能回答相应的小a数是多少呢?(小a数可能过大,对答案取模1e9+7)
Format
Input
一个整数n, 1≤n≤1e6
Output
一个整数
Samples
输入数据 1
2
输出数据 1
4
输入数据 2
11
输出数据 2
4
代码(WEI)
#include <iostream>
#include <cmath>
const int m=1000000007;
int f(long long a)
{
int b=1;
if(a==0||a==1)
{
return 0;
}
else if(a==2)
{
return 1;
}
else
{
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)
{
b=0;
return 0;
}
}
if(b==1)
{
return 1;
}
}
}
long long fp(long long a)
{
long long base=a;
long long res=1;
while(a)
{
if(a&1)
{
res=(res*base)%m;
}
base=(base*base)%m;
a>>=1;
}
return res;
}
using namespace std;
int main()
{
long long n;
cin >> n;
while(1)
{
if(n>=1&&n<=9)
{
cout << fp(n);
break;
}
else
{
int c=1;
int b=f(n);
if(b==1)
{
int nn=n;
int biao=1;
while(nn>0)
{
int w=nn%10;
if(f(w)!=1)
{
biao=0;
break;
}
nn/=10;
}
if(biao==0)
{
c=0;
}
}
else
{
c=0;
}
if(c==0)
{
int sum=0;
int nnn=n;
while(nnn>0)
{
int w=nnn%10;
sum+=w;
nnn/=10;
}
n=sum;
}
else if(c==1)
{
cout << fp(n);
break;
}
}
}
return 0;
}
H.king选太子
啊,从前有一个国家。此国兵强马壮,但是国王却身体不好。于是就想挑一位太子出来;
但是问题来了,国王不知道他有几个孩子(这国王糊涂吧!),他只知道他的孩子的年龄都是不同的。同时这个国王也有要求,他认为孩子年龄太大的过于迂腐,而年龄太小又不成熟,(这孩子挑的也太难了吧),他就想要年龄在他们孩子之间是最中间的(如果孩子的个数为偶数,那么选中间的两个皇子中年龄较大的那个)。
输入格式
第一行有一个整数T,代表有T组数据(T<=10) 第二行有一个整数n(0<n<=15),紧随着有n个数代表有n个皇子(年龄都是整数)
输出格式
每行输出这串数字的太子的年龄
样例
样例输入
2
3
1 2 3
4
1 2 3 4
样例输出
2
3
代码(WEI)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int arr[n];
for(int i=0;i<n;i++)
{
cin >> arr[i];
}
sort(arr,arr+n);
cout << arr[n/2] << endl;
}
return 0;
}
1 comments
-
sup0 LV 10 @ 2022-10-22 17:29:23
E题 3^n。
- 1