寒假刷題11:And Then There Was One(LA 3882) DP

題目鏈接:
And Then There Was One

題目解析:
約瑟夫問題的變種,把第一個刪除的數從1改爲m。
如果是0~n-1,從0開始刪除,有結論

F(1)=0;
F(n)=(F(n-1)+k)%n;

本題是從m開始,故答案爲 (m-k+1+F[n])%n

AC代碼:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<cmath>
    #include<vector>
    using namespace std;
    #define ll long long

    int f[10010];
    int main()
    {
        int n,k,m;
        while(scanf("%d%d%d",&n,&k,&m)!=EOF && n)
        {
            f[1]=0;
            for(int i=2;i<=n;i++) f[i]=(f[i-1]+k)%i;
            int ans=(m-k+1+f[n])%n;
            if(ans<=0) ans+=n;
            cout<<ans<<endl;
        }
        return 0;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章