1 条题解

  • 7
    @ 2024-1-24 21:20:17

    Update on 7.25 修复了当年 Latex 的格式问题

    这题改自CSP-J2023的T1小苹果,原题见洛谷(还是道橙题)

    本人参赛的时候0分,厚礼蟹!

    今天我来造福大众

    先看第一个问题:

    要几轮才能拿完石子? 我们只需要模拟出来一轮会拿走几个石子,再一轮一轮拿,每轮计数器+1,直到拿完,输出计数器的值 至于每轮拿几个,上打表法! k=2k=2 时:

    剩余石子数 拿走石子数
    1,2,31,2,3 11
    4,5,64,5,6 22
    7,8,97,8,9 33
    ...

    由此可以得出 k=2k=2 时,每轮要拿 n+23\lfloor \dfrac{n+2}{3} \rfloor 个石子 再然后另外两个打表也能得出来:

    k=3时,每轮要拿 n+34\lfloor \dfrac{n+3}{4} \rfloor 个石子

    k=4时,每轮要拿 n+45\lfloor \dfrac{n+4}{5} \rfloor 个石子

    如果你特别聪明,一定发现了:

    每轮你可以拿 n+kk+1\lfloor \dfrac{n+k}{k+1} \rfloor 个石子

    再看第二个问题:

    拿走第n个石子是在第几轮? 这个问题可以画图研究:

    ●○○○……○( k+1k+1 个)●○○○…○●……●○○○…○( k+1k+1 个)●

    可以看出,在剩余石子能被分成若干个 k+1k+1 还剩余一个时(即 nmod(k+1)=1n \bmod (k+1) = 1 ),就能拿走第 nn 个石子 那么只要满足这个条件就行吗?

    NO!!!!

    让我们看看 n=7,k=2n=7, k=2 的情况

    1. ●○○●○○● 此时第 77 个已经被拿走
    2. ●○○●虽然也满足 nmod(k+1)=1n \bmod (k+1) = 1,但如上面所说,第 77 个早被拿走了,不符合条件

    所以,我们必须保证是第一次满足这个条件,第 nn 个石子才会被拿走,那该怎么办呢?

    Flag~~

    只要用一个 flag 标记一下首次就行了

    由此得代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        long long n,k,a=0,ans,flag=0;  
        //a是拿的轮数, ans为拿走第n个石子的轮次,flag是标记“第一次满足n%(k+1)==1”
        cin>>n>>k;
        while(n!=0){
            a++; //每拿一轮轮次数+1
            if(n%(k+1)==1&&flag==0){ 
                ans=a;
                flag++; //若是第一次满足,就给flag+1,完成标记
            }
            n-=(n+k)/(k+1); //刚推的公式
        }
        cout<<a<<" "<<ans;
        return 0; //好习惯
    }
    

    看完这里,点个赞再走吧❤

  • 1

信息

ID
494
时间
1000ms
内存
256MiB
难度
6
标签
递交数
74
已通过
24
上传者