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的情况然后算循环的次数即可。
/* ***********************************************
Author :111qqz
Created Time :2017年11月01日 星期三 00时14分38秒
File Name :6043.cpp
************************************************ */
1#include <bits/stdc++.h>
2#define PB push_back
3#define fst first
4#define sec second
5#define lson l,m,rt<<1
6#define rson m+1,r,rt<<1|1
7#define ms(a,x) memset(a,x,sizeof(a))
8typedef long long LL;
9#define pi pair < int ,int >
10#define MP make_pair
1using namespace std;
2const double eps = 1E-8;
3const int dx4[4]={1,0,0,-1};
4const int dy4[4]={0,-1,1,0};
5const int inf = 0x3f3f3f3f;
6LL n,k;
7int main()
8{
9 #ifndef ONLINE_JUDGE
10 //freopen("./in.txt","r",stdin);
11 #endif
12 int cas = 0 ;
13 while (~scanf("%lld %lld",&n,&k))
14 {
15 printf("Case #%d: ",++cas);
16 if (k<=n)
17 {
18 printf("%lld\n",k);
19 continue;
20 }
21 k-=n;
22 LL num = (k-1)/(n-1)+1;
23 LL yu = k%(n-1);
24 if (yu==0) yu+=n-1;
25 if (num%2==1)
26 {
27 printf("%lld\n",yu);
28 }
29 else
30 {
31 if (yu<=n-2) printf("%lld\n",yu);
32 else printf("%lld\n",n);
33 }
34 }
1 #ifndef ONLINE_JUDGE
2 fclose(stdin);
3 #endif
4 return 0;
5}