【CSU-1101】解题报告(水题,模拟)

原始题目

1101: 报数游戏

  • Time Limit: 1 Sec
  • Memory Limit: 128 Mb
  • Submitted: 1400
  • Solved: 474

Description

n个人站成一行玩一个报数游戏。所有人从左到右编号为1到n。游戏开始时,最左边的人报1,他右边的人报2,编号为3的人报3,等等。当编号为n的人(即最右边的人)报完n之后,轮到他左边的人(即编号为n-1的人)报n+1,然后编号为n-2的人报n+2,以此类推。当最左边的人再次报数之后,报数方向又变成从左到右,依次类推。 为了防止游戏太无聊,报数时有一个特例:如果应该报的数包含数字7或者是7的倍数,他应当用拍手代替报数。下表是n=4的报数情况(X表示拍手)。当编号为3的人第4次拍手的时候,他实际上数到了35。

1.png
1.png

给定\(n,m,k\),你的任务是计算当编号为 \(m\) 的人第 \(k\) 次拍手时,他实际上数到了几。

Input

输入包含不超过10组数据。每组数据占一行,包含三个整数 \(n,m\)\(k\) \(( 2 ≤ n ≤ 100, 1 ≤ m ≤n, 1 ≤ k ≤ 100)\)。输入结束标志为 \(n=m=k=0\)

Output

对于每组数据,输出一行,即编号为 \(m\) 的人第 \(k\) 次拍手时,他实际上数到的那个整数。

Sample Input

4 3 1
4 3 2
4 3 3
4 3 4
0 0 0

Sample Output

17
21
27
35

Hint

Source

湖南省第七届大学生计算机程序设计竞赛

题目大意

如题

解题思路

直接模拟

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <iomanip>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <bits/stdc++.h>
#define fi first
#define se second
#define rep(i,a,n) for(int i=a;i<n;++i)
#define per(i,a,n) for(int i=n-1;i>=a;--i)
#define cl(x,a) memset(x,a,sizeof(x))
#define all(x) x.begin,x.end()
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef pair<string,string> pss;

const int maxn=1e5+5;
const int maxm=1e5+5;
const int maxl=26;
int vis[maxn];
bool check(ll num){
while(num){
int temp=num%10;
if(temp==7) return 1;
num/=10;
}
return 0;
}
int main(){
ll n,m,k,cnt=0;
int flag=0;
while(~scanf("%lld%lld%lld",&n,&m,&k) && n+m+k){
memset(vis,0,sizeof(vis));
flag=0,cnt=0;
while(vis[m]<k){
rep(i,1,n){

if((++cnt )%7==0 || check(cnt)) {
// cout<<"i="<<i<<" cnt="<<cnt<<endl;
vis[i]++;
}
if(vis[m]==k) break;
}
if(vis[m]==k) break;
per(i,2,n+1){

if((++cnt)%7==0 || check(cnt)) {
// cout<<"i="<<i<<" cnt="<<cnt<<endl;
vis[i]++;
}
if(vis[m]==k) break;
}
}
cout<<cnt<<endl;
}

}

收获与反思

直接模拟即可