UVA305 - Joseph(数论 + 打表)

UVA305 - Joseph(数论 + 打表)

题目链接

题目大意:约瑟夫环问题:n个人围成一圈,每次都淘汰第m个人,问最后一个幸存下来的人的编号。

这题的意思有点不一样,它规定前面的k个人是好人,后面的k个人是坏人(2
?
k形成环)。问最小的m是多少,可以先把后面的k个坏人淘汰再淘汰好人。

解题思路:这题有个递推式:ai = (ai - 1 + m - 1) % (2
?
k - (i - 1))

ai表示第i次淘汰的人的编号。后面取余的是剩下的人数。

注意这题的k仅仅可能有14种,可是測试的例子可能有非常多,所以要先将每种k的可能相应的值算出来保存下来。不然会超时。

代码:

#include <cstdio>
#include <cstring>

using namespace std;

const int N = 20;A

int solve (int k) {

    int n = 2 * k;
    int m = k + 1;
    int pre, cnt;
    while (1) {

        cnt = 1;
        pre = (m % n) == 0 ? n : m % n;
        while (cnt <= k) {
            if (pre <= k)
                break;
            pre = (pre + m - 1) % (n - cnt) == 0 ? (n - cnt) : (pre + m - 1) % (n - cnt);
            cnt++;
        }

        if (cnt == k + 1)
            return m;
        else {

            if (m % n == 0)
                m += k + 1;
            else
                m++;
        }
    }
}

int main () {

    int k;
    int ans[N];
    for (int i = 1; i < 15; i++)
        ans[i] = solve(i);
    while (scanf ("%d", &k) && k) {
        printf ("%d\n", ans[k]);
    }
    return 0;
}
时间: 2024-12-15 05:11:43

UVA305 - Joseph(数论 + 打表)的相关文章

HDU 2802 F(N) 数论+打表

题目大意:f[n]-n^3=f[n-2]-(n-1)^3 (n >=3),f[1]=1,f[2]=7,求f[n]. 题目思路:将n^3移到到等式右边化简的到:f[n]=f[n-2]+3n*(n-1)+1: 因为第n项与第n-2项有关,所以知道了f[1]与f[2]的值可以分奇偶打下表,找到循环节为4018. #include<cstdio> #include<stdio.h> #include<cstdlib> #include<cmath> #incl

hdu 1262 寻找素数对 数论 打表。

寻找素数对 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8771    Accepted Submission(s): 4395 Problem Description 哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数. 做好了这件实

【2019.10.25】

summary 分情况拿分保底真的很好用 像我这种辣鸡应该注意保底 打题不要慌 有条理 不要东一条西一条 小奇采药 对于 30% 的数据,O(2n ) 枚举取 or 不取 对于 60% 的数据,O(nm) 做 01 背包,即 f(i, j) 表示前 i 株 草药,耗费 j 的时间能达到的最?代价. 对于 100% 的数据,注意到 m,t,v 纯随机 那么不会选太多的草药,?耗时较少的草药有很?概率存在 于最优解中 针对这些性质优化搜索 当然也可以合理使用随机化和卡时,复杂度 O(?学) 最基础6

POJ 2800 Joseph’s Problem 数论找规律

Description 求 Input 两个整数n和k(1<=n,k<=1e9) Output 输出 Sample Input 5 3 Sample Output 7 暴力超时,这样就打下表找下余数的规律.输入100,27,一下子就可以看出来,倒着的看,是一段一段的等差序列. 例如100 25 除数 1    2    3    4    5    6    7    8    9     10     11    12   13 14  15  ......25   26........ 商

[Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 哈特13最近在学习数论问题,然后他智商太低,并学不懂.这不,他又碰到不会的题了.题意非常简单: 有n个数字,求出这些数字中两两最大公约数的最大值.你一定要帮助他解决这个问题啊. Input 多组输入,约25组,直到文件末尾.每组数据占2行,第一行为数字个数n,2<=n<=100000第二行即为对应

UVa1363 - Joseph&#39;s Problem(数论)

在题目中有三种情况: 1.1<k<n: 2.k == n ; 3.k>n; 对于第一种情况我们可以分为1到k和k到n两个子问题来解. 1.1.1到k: for( i = 1 , sum = 0 ; i <= k ; i ++ ) sum += k %i ; 1.2.k到n: sum =(n-k)*k; 而对于第二种情况就是第一种情况的(1).但是就这样写的话时明显的tle的. 对于第二种情况也可以分为几个小问题来求解: 2.1.1到k/2: for( i = k/2 ; i >

UVA 1363 - Joseph&#39;s Problem(数论)

UVA 1363 - Joseph's Problem 题目链接 题意:给定n, k,求出∑ni=1(k mod i) 思路:由于n和k都很大,直接暴力是行不通的,然后在纸上画了一些情况,就发现其实对于k/i相同的那些项是形成等差数列的,于是就可以把整个序列进行拆分成[k,k/2],[k/2, k/3], [k/3,k/4]...k[k/a, k/b]这样的等差数列,利用大步小步算法思想,这里a枚举到sqrt(k)就可以了,这样就还剩下[1,k/a]的序列需要去枚举,总时间复杂度为O(sqrt(

UVa 1363 (数论 数列求和) Joseph&#39;s Problem

题意: 给出n, k,求 分析: 假设,则k mod (i+1) = k - (i+1)*p = k - i*p - p = k mod i - p 则对于某个区间,i∈[l, r],k/i的整数部分p相同,则其余数成等差数列,公差为-p 然后我想到了做莫比乌斯反演时候有个分块加速,在区间[i, n / (n / i)],n/i的整数部分相同,于是有了这份代码. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace

Codeforces 542D Superhero&#39;s Job 数论 哈希表 搜索

原文链接https://www.cnblogs.com/zhouzhendong/p/CF542D.html 题目传送门 - CF542D 题目传送门 - 51Nod1477 题意 定义公式 $J(x) = \sum_{1 \leq k \leq x 且 k|x 且 \gcd (k,x/k) = 1} k$ . 现在给定一个整数 $A$ ,要求有多少正整数 $x$ ,满足 $J(x)=A$ . $x|n$ 表示 $x$ 是 $n$ 的因子. $\gcd(a,b) 表示 $a$ 和 $b$ 的最大