A 逃出生天
题目描述:
gold学长从昏迷中醒来以后发现自己被困在一个山洞里,他找了很久,终于找到一个门。门上写着:想要逃出去,只有一个办法 你可以选择一个数n,设m=1 * 2 * … * (n-1)。如果m是n的倍数,那么门就会自动打开,否则你就别想出去了。 gold学长内心充满了绝望,他想了一些数,但他不知道这些数能不能保证自己逃出去。你能帮助gold学长逃出生天吗?
输入:
第一行一个数T(T<=1000),表示gold学长想的数的个数 接下来每一行一个数n(2<=n<=1e8),表示gold学长想的数
输出:
每行一个输出 对于每一个数,如果学长能逃出去,则输出“escape”(不含引号),否则输出“trapped”(不含引号)
Input
4
5
6
7
8
output
trapped
escape
trapped
escape
分析: 看题解上的是找规律,TAT ,我还给弄复杂了。我的想法是题意就是求 n | m=(n-1)! . 从算术基本定理角度考虑,我们假设
n = p1^r1 * p2^r2 * p3^r3 ……pn^rn
m= q1^s1 * q2^s2 * q3^s3 …….qm^sm
想要n是m的因子,我们可以认为p1到pn中所有的质因子m中都有, 同时对于n中质因子,m的相同的质因子指数 s >= r 才可以符合题意。
代码
.
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 1e5 ;
bool su[MAXN+2];int prm[MAXN+2],sz=0;
void init(){
su[0]=su[1]=1;
for(int i=2;i<=MAXN;i++){
if(!su[i]) prm[++sz]=i;
for(int j=1;j<=sz;j++){
LL t=prm[j]*i;
if(t>MAXN) break;
su[t]=true;
if(i%prm[j]==0) break;
}
}
//printf("sz==%d\n",sz);
}
int n,m;
void solve(){
bool flag=1; int nn=n;
for(int i=1;i<=sz&&(LL)prm[i]*prm[i]<=n;i++) {
//puts("==");
if(n%prm[i]==0) {
int ge=0;
//puts("---");
while(n%prm[i]==0) { ge++; n/=prm[i];}
int cnt=0,m=nn-1;
while(m) { cnt+=m/prm[i]; m/=prm[i]; }
if(cnt<ge){
flag=0;break;
}
}
}
if(flag&&n>1&&(nn-1)<n) flag=0;
if(flag) puts("escape") ;
else puts("trapped");
}
int main(){
int T ; init();
scanf("%d",&T);
while(T--){
scanf("%d",&n);
solve();
}
return 0;
}
C 我爱数学
题目描述:
viewsetting特别喜欢数学,但是他算除法的时候特别不熟练,常常会出错。为了维持他对数学的兴趣,你能不能帮他做一下除法运算呢?
输入:
第一行是一个整数T(T≤1000),表明数据组数。 每组数据包括一行的两个整数a、b,用空格隔开。输入保证在int的范围内,且保证运算合法。
输出:
每组数据输出一行a÷b的值。保留6位小数。
2
114 514
1919 810
0.221790
2.369136
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
double a,b;
int t;scanf("%d",&t);
while(t--){
scanf("%lf %lf",&a,&b);
double c=a/b;
printf("%.6f\n",c);
}
return 0;
}
D PJ的 情书
题解连接
E: ingayass Bio Cards Collecting
题解链接
F Harry Potter And The Half-Blood Prince
题目描述:
这几天HBO一直在播放哈利波特系列电影,viewsetting觉得还行,就刷了一遍。哈利波特系列电影改编自J.K.Rowling的同名系列小说。在Harry Potter And The Half-Blood Prince中,哈利·波特和阿不思·邓布利多成功说服了霍拉斯·斯拉格霍恩重返学校,担任魔药课教师,而西弗勒斯·斯内普教授则如愿以偿,成为了黑魔法防御课老师。在第一节哈利·波特还没发到书的魔药课上,霍拉斯·斯拉格霍恩借给了哈利一本旧的魔药课课本。哈利发现,这本旧课本上面签着“Half Blood Prince”这个名字,此外这本书上还有很多笔记。可是问题来了,这个Half Blood Prince可不是等闲之辈,作为当年的学霸,他的学霸笔记可以让哈利波特的魔药学成绩提高到全班最高,然而他记笔记的习惯特别恶心。为了防止有人抄他的笔记,Half Blood Prince研制了一套密码笔记书写机制。他使用了一个函数转换他的笔记:对于a-z和A-Z这些拉丁字母,如果另a编号为0,b为1 ……依次类推,z为25。同样的A为0,B为1……Z为25。其实Half Blood Prince使用的是y=(kx+b)%26(%是取模运算符)的加密模式,也就是y是笔记上字符编号x对应的真实笔记的字符编号。那么举个栗子:假如这个密钥的加密模式是y=(x+1)%26,那么笔记中的“Bqtrg vhsg akcd.”应该表达的是“Crush with blade.”(注意除了大小写的字母外其他字符不用处理)。那么问题来了,为了让剧情发展下去,哈利波特告诉了你Half Blood Prince笔记的加密模式和参数k和b的值,你能设计一个解码程序,帮他还原学霸笔记,击败赫敏登上全班第一的宝座吗?
输入:
第一行两个整数k和b,均在一百以内,其中k>0,b>=0。第二行一个字符串(Length<=1000),代表Half Blood Prince的一条原始笔记。注意是多组输入。
输出:
这条笔记的真实版本,也就是根据转码规则得到的解码版本。
1 1
Bqtrg vhsg akzcd.
Crush with blade.
分析: 模拟就行,
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
char s[MAXN];
int main(){
int k,b;
while(scanf("%d%d",&k,&b)!=EOF){
getchar();
gets(s);int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]>='a'&&s[i]<='z') {
int x=s[i]-'a';
int y=(k*x+b)%26;
putchar(y+'a');
}else if(s[i]>='A'&&s[i]<='Z'){
int x=s[i]-'A';
int y=(k*x+b)%26;
putchar(y+'A');
}else putchar(s[i]);
}
puts("");
}
return 0;
}
G Harry Potter and the Prisoner of Azkaban
题目描述:
Viewsetting又看了一部哈利波特系列电影:Harry Potter and the Prisoner of Azkaban(哈利·波特与阿兹卡班的囚徒)。电影里出现了一个魔法道具:活点地图。乍看之下,这张地图只是一张空白的羊皮纸;但是当使用者说出“我庄严宣誓我没干好事”(“我庄严宣誓我不怀好意”I solemnly swear that I am up to no good) ,墨线就会开始延伸,浮现出一张霍格沃茨的地图(包括秘密通道)。地图上有霍格沃茨里每个人所在的位置,并指示打开秘密通道的方法。使用完毕之后,只要说“恶作剧完毕”(Mischief managed),就可以将地图复原成空白的状态,以防止其他不知道地图口令的人使用。活点地图是莱姆斯·卢平、小矮星彼得、小天狼星布莱克以及詹姆·波特(哈利的爸爸)共同发明的,专门用来达成恶作剧。他们在就寝时间后,常常化身为动物四处探险,使得他们对霍格沃茨的地下通道有很多了解(布莱克,小矮星和波特是阿尼马格斯,而卢平是狼人。)他们将所发现的秘密通道,制作成活点地图。地图上写著这几位创造者的名字,他们采用仅限彼此所知的昵称(代表他们幻化成的动物):月亮脸(指身为狼人的卢平),虫尾巴(指小矮星,化身成老鼠),大脚板(布莱克,化身成狗),以及尖头叉子(波特,化身为雄鹿)。而这也是活点地图标题的由来。
哈利波特用这张地图可以说是开了外挂,游戏体验++,然而斯内普发现了哈利有这张地图,并且试图找出其中的秘密,但却被地图羞辱了一顿。卢平教授表示他会调查,就将地图带走了。可是现在哈利波特特别需要这张地图,于是他找到了你,帮他完成这个魔法地图。但是你只是一个麻瓜(不会膜法的普通人类),那里会这些骚操作?但是你可是会计算机的大手子啊!你就拥有那些魔法师眼中的“黑魔法”!请你编写一个程序,同样也能实现这个地图的功能。
输入:
多组输入,以EOF结束 每组第一行输入一个n(n<=999),代表记录中有n个魔法师。接下来n行,每行依次输入魔法师的名字,起始坐标和编号。其中坐标(x,y)意义是x坐标代表东西方向,x正方向为东。类似的,y是北正南负且坐标都是整数有序对。编号是三位的,如有前导零则要补足,编号不超过999。 接下来输入一个正整数k。然后接下来k行对应这地图的记录,如果这个魔法师移动了,依次输入其编号,方向(N为北,S为南,W为西,E为东),步数(正整数)。如果这个魔法师没有移动,格式是编号和”stay”。
输出:
和输入格式一样,按照序号从小到大的顺序换行输出魔法师的名字,当前坐标和编号。
5
Harry (1,1) 231
Hermione (2,2) 402
Ron (1,0) 311
Dumbledore (10,10) 000
Snape (-1,-1) 007
3
231 E 1
402 S 1
007 stay
Dumbledore (10,10) 000
Snape (-1,-1) 007
Harry (2,1) 231
Ron (1,0) 311
Hermione (2,1) 402
分析: 模拟就行。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1000+11;
struct Infom{
char name[1000];
int x,y,id;
}node[MAXN];
int pos[MAXN];
bool cmp(Infom a,Infom b){
return a.id<b.id;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(pos,-1,sizeof(pos));
for(int i=0;i<n;i++){
scanf("%s (%d,%d) %d",node[i].name,&node[i].x,&node[i].y,&node[i].id);
pos[node[i].id]=i;
}
int k;scanf("%d",&k);
while(k--) {
int id;char ch[10]; int step ;
scanf("%d %s",&id,ch);
if(ch[0]=='s') continue;
scanf("%d",&step);
if(ch[0]=='N') node[pos[id]].y+=step;
else if(ch[0]=='S') node[pos[id]].y-=step;
else if(ch[0]=='W') node[pos[id]].x-=step;
else if(ch[0]=='E') node[pos[id]].x+=step;
}
sort(node,node+n,cmp);
for(int i=0;i<n;i++)
printf("%s (%d,%d) %03d\n",node[i].name,node[i].x,node[i].y,node[i].id);
}
return 0;
}
H Lethe的手环
题解链接
I : 聪会长的关爱
题目描述:
大家都知道NEUQ-ACM俱乐部的会长聪聪是个英俊帅气的暖男,他最喜欢关心各路好看的妹子了。 这一天,他来到工学馆的一间教室,发现好多好多的漂亮小姐姐。但是小姐姐们都被一些丑陋的男人围着,聪聪很害怕,他不想得罪他们。 所以聪聪决定从一个小姐姐开始,把所有和她相邻的小姐姐,以及相邻的相邻的小姐姐(相邻小姐姐是指横、竖或对角线方向的第一位小姐姐)都关心一遍,而不跨过那些丑陋的男人。 请问聪聪最多能关心到多少个小姐姐?
输入:
多组输入。 每组第一行输入两个数m和n(0 < m , n < =1000),表示教室的大小,有m行n列的座位。当m和n为0时停止程序。 输入一个教室的人员分布图,用一个矩阵表示,其中“@”表示小姐姐,“*”表示丑陋的男人。
输出:
每组输出一行一个数字,表示聪聪最多能撩到的小姐姐数量。
5 5
**@
@@@
@*@
@@@*@
@@**@
0 0
8
分析: 就是求联通快问题。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000+11;
int n,m;
int mp[MAXN][MAXN];
int to[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,-1,-1,1,1,-1}; // 这里注意是8个方向
int cnt;
void DFS(int x,int y){
mp[x][y]=0; cnt++;
for(int i=0;i<8;i++) {
int nx=x+to[i][0];
int ny=y+to[i][1];
if(mp[nx][ny]) DFS(nx,ny);
}
}
char s[MAXN];
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
for(int i=1;i<=n;i++){
scanf("%s",s);
for(int j=0;s[j];j++)
if(s[j]=='@') mp[i][j+1]=1; // 1代表小姐姐
else mp[i][j+1]=0; //0 代表边界和丑男
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) {
if(mp[i][j]) {
cnt=0; DFS(i,j);
ans=max(ans,cnt);
}
}
}
printf("%d\n",ans);
}
return 0;
}