题意是说KazaQ有n双袜子,标号1到n放在柜子里,每天早上起床穿袜子选标号最小的一双。然后晚上回来将穿过的扔到篮子里。当篮子里的袜子数量为n-1的时候,就把这些袜子洗一下,第二天晚上再放回柜子里。问KazaQ在第K天穿的是哪一个标号的袜子。
简单排一下就会发现这个题有一个简单的规律,前n天肯定都是按标号穿,然后后面几天因为穿第n双袜子的时候,所以穿1到n-1号,之后n号袜子在洗所以穿1号袜子。然后穿1到n-2号,因为此时n-1号在洗,所以接下来穿的是n号袜子,依次类推便可发现袜子穿的标号顺序为1、2、...、n、1、2、...、n-1、1、2、...、n-2、n、.....由此规律来进行分段,前面n个数直接输出,后面的分开前后两部分,取模就可以得出结果了。
下面AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
long long n,k;
long long t;
int Case=0;
while(scanf("%lld%lld",&n,&k)!=EOF)
{
Case++;
cout<<"Case #"<<Case<<": ";
if(k<=n)
{
cout<<k<<endl;
continue;
}
if(n==2)
{
if(k%2==0)
cout<<2<<endl;
else
cout<<1<<endl;
continue;
}
k-=n;
t=k%((n-1)*2);
if(t==0)
t=(n-1)*2;
if(t<n)
{
cout<<t<<endl;
}
else
{
if(t%(n-1)==0)
{
cout<<n<<endl;
}
else
{
cout<<t%(n-1)<<endl;
}
}
}
return 0;
}