zoukankan      html  css  js  c++  java
  • poj3517约瑟夫问题

    直接套公式+

    假设除去第k个人。

    0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1  //original sequence (1)

    0, 1, 2, 3, ..., k-2,      , k, ..., n-1  //get rid of kth person (2)

    k, k+1, ..., n-1,    0,    1,        ..., k-2  //rearrange the sequence (3)

    0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2  //the n-1 person (4)

    我们假设f(n)的值为n个人中最后存活的人的序号,则

    注意到(2)式(3)式(4)式其实是同一个序列。

    注意(1)式和(4)式,是同一个问题,不同的仅仅是人数。

    假设我们已知f(n-1),即(4)式中最后剩下的人的序号,则(3)式所对应的序号,就是f(n),即(1)式n个人中最后存活的序号。

    而从(3)(4)式中我们不难发现有这样一个递推式:

    f(n) = (f(n-1) + k) % n

    显然,f(1) = 0。

    于是递推得f(n)

    因为是从m开始,所以递推的最后要单独列出来

    普通的约瑟夫是从0开始

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=35000+10,maxn=500+100,inf=0x3f3f3f;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m,k;
        while(cin>>n>>k>>m){
            if(!n&&!k&&!m)break;
            int ans=0;
            for(int i=2;i<n;i++)
                ans=(ans+k)%i;
            cout<<(ans+m)%n+1<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    ADO.NET Entity Framework(5)esql (二)。
    google首页动态图片代码
    ms sql 聚合事例
    GridView 一些操作
    《狼与狗的故事》
    Asp.net日期字符串格式化显示方法
    解决网爬工具爬取页面信息出现乱码的问题
    esql的查询结果集 ObjectQuery
    去空空格 null sql
    不安装 oracle的客户,就可以使用pl/sql访问远程oracle 数据库的方法
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7271947.html
Copyright © 2011-2022 走看看