poj 2800 找规律
2017-04-15 19:02
274 查看
Joseph's Problem
Description
Joseph likes taking part in programming contests. His favorite problem is, of course, Joseph's problem.
It is stated as follows.
There are n persons numbered from 0 to n - 1 standing in a circle. The person numberk, counting from the person number 0, is executed. After that the person number k of the remaining persons is executed, counting from the person after the last executed one.
The process continues until only one person is left. This person is a survivor. The problem is, given n and k detect the survivor's number in the original circle.
Of course, all of you know the way to solve this problem. The solution is very short, all you need is one cycle:
Here "x mod y" is the remainder of the division of x by y, But Joseph is not very smart. He learned the algorithm, but did not learn the reasoning behind it. Thus he has forgotten the details of the algorithm and remembers the solution just approximately.
He told his friend Andrew about the problem, but claimed that the solution can be found using the following algorithm:
Of course, Andrew pointed out that Joseph was wrong. But calculating the function Joseph described is also very interesting.
Given n and k, find ∑1<=i<=n(k mod i).
Input
The input file contains n and k (1<= n, k <= 109).
Output
Output the sum requested.
Sample Input
Sample Output
Source
Northeastern Europe 2005
题意: 求给出的n,k的∑1<=i<=n(k
mod i).
思路:直接暴力的话肯定要超了,所以需要想办法缩减
p = k/i
k mod i = k - p * i
k mod ( i + 1 ) = k - p * ( i + 1 ) = k mod i - p
k mod ( i + 2 ) = k - p * ( i + 2 ) = k mod i - 2 * p
对于连续的 i ,很多p都是一样的 . 相差的部分是一个等差数列 ,
i 的 范围是 从 i 到 min(k/p,n) 如果 p == 0 则 一直延续到最后
ac代码:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7519 | Accepted: 1977 |
Joseph likes taking part in programming contests. His favorite problem is, of course, Joseph's problem.
It is stated as follows.
There are n persons numbered from 0 to n - 1 standing in a circle. The person numberk, counting from the person number 0, is executed. After that the person number k of the remaining persons is executed, counting from the person after the last executed one.
The process continues until only one person is left. This person is a survivor. The problem is, given n and k detect the survivor's number in the original circle.
Of course, all of you know the way to solve this problem. The solution is very short, all you need is one cycle:
r := 0; for i from 1 to n do r := (r + k) mod i; return r;
Here "x mod y" is the remainder of the division of x by y, But Joseph is not very smart. He learned the algorithm, but did not learn the reasoning behind it. Thus he has forgotten the details of the algorithm and remembers the solution just approximately.
He told his friend Andrew about the problem, but claimed that the solution can be found using the following algorithm:
r := 0; for i from 1 to n do r := r + (k mod i); return r;
Of course, Andrew pointed out that Joseph was wrong. But calculating the function Joseph described is also very interesting.
Given n and k, find ∑1<=i<=n(k mod i).
Input
The input file contains n and k (1<= n, k <= 109).
Output
Output the sum requested.
Sample Input
5 3
Sample Output
7
Source
Northeastern Europe 2005
题意: 求给出的n,k的∑1<=i<=n(k
mod i).
思路:直接暴力的话肯定要超了,所以需要想办法缩减
p = k/i
k mod i = k - p * i
k mod ( i + 1 ) = k - p * ( i + 1 ) = k mod i - p
k mod ( i + 2 ) = k - p * ( i + 2 ) = k mod i - 2 * p
对于连续的 i ,很多p都是一样的 . 相差的部分是一个等差数列 ,
i 的 范围是 从 i 到 min(k/p,n) 如果 p == 0 则 一直延续到最后
ac代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; typedef long long int LL; LL n,k; int main() { freopen("joseph.in ","r",stdin); freopen("joseph.out","w",stdout); while( 4000 cin>>n>>k) { LL ret=0; for(int i=1;i<=n;i++) { LL p = k/i; if(p==0) { ret += (n-i+1)*k; break; } else { LL q = k/p; if(q>n) q = n; LL md = k%i; LL num = q-i+1; LL temp = md*num-(num-1)*num/2*p; ret += temp; i=q; } } cout<<ret<<endl; } return 0; }
相关文章推荐
- POJ 2800 Joseph’s Problem 数论找规律
- Poj 2800 Joseph's Problem - 找规律
- 第十七天:poj1019(纯属数学题目,找到规律就能解出)
- poj 1063 Flip and Shift 规律题
- poj1663(找规律,水题啊啊)
- POJ 1597 find the nth digit (找规律)
- HDU 1525&&POJ 2348 Euclid's Game 规律博弈(难)
- POJ 1852:Ants【规律】
- POJ 2965(dfs ,规律)
- poj 3725 I know the k-th integer(数学计算找规律)
- POJ 2484 A Funny Game(规律直推)
- Uva16009 POJ 1906 Three Powers 数论 玄学找规律题 高精
- POJ 1450 Gridland(我的水题之路——找规律)
- POJ 2229 Sumsets 【规律题】
- POJ 1082 Calendar Game 原来这题有个超简单的规律
- POJ 2484 A Funny Game(规律直推)
- poj 1019 Number Sequence 找规律 思维题 ()
- Uva16009 POJ 1906 Three Powers 数论 玄学找规律题 高精
- POJ1338 & POJ2545 & POJ2591 & POJ2247 找给定规律的数
- poj 2013 Symmetric Order 规律