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}