• 2017ACM暑期多校联合训练


    题目链接

    Problem Description

    KazaQ wears socks everyday.

    At the beginning, he has n pairs of socks numbered from 1 to n in his closets.

    Every morning, he puts on a pair of socks which has the smallest number in the closets.

    Every evening, he puts this pair of socks in the basket. If there are n−1 pairs of socks in the basket now, lazy KazaQ has to wash them. These socks will be put in the closets again in tomorrow evening.

    KazaQ would like to know which pair of socks he should wear on the k-th day.

    Input
    The input consists of multiple test cases. (about 2000)

    For each case, there is a line contains two numbers n,k (2≤n≤109,1≤k≤1018).

    Output
    For each test case, output "Case #x: y" in one line (without quotes), where x indicates the case number starting from 1 and y denotes the answer of corresponding case.

    Sample Input
    3 7
    3 6
    4 9

    Sample Output
    Case #1: 3
    Case #2: 1
    Case #3: 2

    分析:
    有n双袜子分别编号1~n,每天从干净的袜子中选择一双编号最小的袜子穿,如果干净的袜子只剩下一双了,就把所有穿过的袜子洗干净接着穿,选择的时候仍然满足上面的规则,问第k天穿的袜子的编号是多少?

    这就是一个找规律的题,我们通过两组数据来看一下他的规律:
    数据1: 3 7
    那每天穿的袜子的序列就是:
    1 2 3 1 2 1 3 那么第七天穿的袜子就是编号3,
    如果我们接着往下看的话,就会发现整个序列是这样子的:
    1 2 3 1 2 1 3 1 2 1 3 1 2 1 3······
    就会发现除了前n天以外,穿的袜子的编号的循环节是 1 2 1 3。

    数据2: 4 9
    那每天穿的袜子的序列就是:
    1 2 3 4 1 2 3 1 2 那么第七天穿的袜子就是编号2,
    如果我们接着往下看的话,就会发现整个序列是这样子的:
    1 2 3 4 1 2 3 1 2 4 1 2 3 1 2 4 1 2 3 1 2 4 ······
    就会发现除了前n天以外,穿的袜子的编号的循环节是 1 2 3 1 2 4。

    通过上面的两组数据我们就可以发现他的循环规律:
    我们将每个循环节的前半部分和后半部分分开,会发现最后一位是在n和n-1直接,前面的就是第几次去袜子对于(n-1)的一个余数。

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main()
    {
        long long int n,k,Case=1;
        {
            while(~scanf("%lld%lld",&n,&k))
            {
                printf("Case #%lld: ",Case++);
                if(k<=n)                 ///直接输出来就行了
                    printf("%lld
    ",k);
                else
                {
                    long long int num=(k-n)/(n-1);///num表示第几次取半循环
                    long long int yu=(k-n)%(n-1);///yu表示在半循环中取第几个
                    if(num%2==0)///偶数次
                    {
                        if(yu==0)///最后一个
                            printf("%lld
    ",n);
                        else
                            printf("%lld
    ",yu);
                    }
                    else///奇数次
                    {
                       if(yu==0)///最后一个
                            printf("%lld
    ",n-1);
                        else
                            printf("%lld
    ",yu);
                    }
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    帝国CMS:清空数据表后,帝国后台存在空白翻页序号,如何处理?
    Wordpress笔记:WP如何设置网站邮件订阅功能?
    Wordpress笔记:如何禁止i0.wp.com、i1.wp.com或i2.wp.com的图片前缀?
    宝塔安装报错: Failed to download metadata for redo 'appstream'
    Wordpress笔记:Briefly unavailable for scheduled maintenance. Check back in a minute.如何解决?
    宝塔安装报错:The BTPanel service startup failed.的解决
    Zblog插件:迁移站点并加SSL后,一键生成静态按钮无法使用
    帝国CMS:Nginx伪静态规则转写为IIS伪静态规则
    记录
    常用工具
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7238751.html
Copyright © 2020-2023  润新知