hdu 6043 | 2017 Multi-University Training Contest - Team 1 K KazaQ's Socks (循环节)
http://acm.hdu.edu.cn/showproblem.php?pid=6043
题意:
n双袜子标号1到n,初始在抽屉里,每天早晨穿一双标号最小的袜子,晚上把脏袜子放到盆里,如果放完之后喷子里已经有了n-1双脏袜子,那么就要洗,然后在第二天晚上放回抽屉里。问第k天穿的是标号为几的袜子。
思路:
手写了几个发现对于n双袜子,标号出现的情况是:
1,2,3…n,1,2,3…n-2,n-1,1,2,3…n-2,n
所以特判k<=n的情况然后算循环的次数即可。
1/* ***********************************************
2Author :111qqz
3Created Time :2017年11月01日 星期三 00时14分38秒
4File Name :6043.cpp
5************************************************ */
6
7#include <bits/stdc++.h>
8#define PB push_back
9#define fst first
10#define sec second
11#define lson l,m,rt<<1
12#define rson m+1,r,rt<<1|1
13#define ms(a,x) memset(a,x,sizeof(a))
14typedef long long LL;
15#define pi pair < int ,int >
16#define MP make_pair
17
18using namespace std;
19const double eps = 1E-8;
20const int dx4[4]={1,0,0,-1};
21const int dy4[4]={0,-1,1,0};
22const int inf = 0x3f3f3f3f;
23LL n,k;
24int main()
25{
26 #ifndef ONLINE_JUDGE
27 //freopen("./in.txt","r",stdin);
28 #endif
29 int cas = 0 ;
30 while (~scanf("%lld %lld",&n,&k))
31 {
32 printf("Case #%d: ",++cas);
33 if (k<=n)
34 {
35 printf("%lld\n",k);
36 continue;
37 }
38 k-=n;
39 LL num = (k-1)/(n-1)+1;
40 LL yu = k%(n-1);
41 if (yu==0) yu+=n-1;
42 if (num%2==1)
43 {
44 printf("%lld\n",yu);
45 }
46 else
47 {
48 if (yu<=n-2) printf("%lld\n",yu);
49 else printf("%lld\n",n);
50 }
51 }
52
53
54
55 #ifndef ONLINE_JUDGE
56 fclose(stdin);
57 #endif
58 return 0;
59}