POJ 2886 Who Gets the Most Candies?(線段樹+反素數)
這個反素數不太會,這道題目其實也不是自己想出來的看了別人的部落格:http://blog.csdn.net/weiguang_123/article/details/7880875
裡面說的很詳細,我就不在多說了啊。
Time Limit: 5000MS | Memory Limit: 131072K | |
Total Submissions: 8786 | Accepted: 2675 | |
Case Time Limit: 2000MS |
Description
N children are sitting in a circle to play a game.
The children are numbered from 1 to N in clockwise order. Each of them has a card with a non-zero integer on it in his/her hand. The game starts from the K-th child, who tells all the others the integer on his card and jumps out of the circle. The integer on his card tells the next child to jump out. Let A denote the integer. If A is positive, the next child will be the A-th child to the left. If A is negative, the next child will be the (−A)-th child to the right.
The game lasts until all children have jumped out of the circle. During the game, the p-th child jumping out will get F(p) candies where F(p) is the number of positive integers that perfectly divide p. Who gets the most candies?
Input
Output
Output one line for each test case containing the name of the luckiest child and the number of candies he/she gets. If ties occur, always choose the child who jumps out of the circle first.
Sample Input
4 2 Tom 2 Jack 4 Mary -1 Sam 1
Sample Output
Sam 3
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-7
#define M 10001000
#define LL __int64
//#define LL long long
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
const int maxn = 5000000;
using namespace std;
struct node
{
int sum;
int l, r;
} f[maxn*4];
char name[maxn][20];
int vis[maxn];
int RPrime[]=
{
1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,
20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200,332640,498960,
554400
}; //反素數
int fact[]=
{
1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84,90,96,100,108,120,128,
144,160,168,180,192,200,216
}; //反素數約數個數
void Bulid(int l, int r, int site)
{
f[site].l = l;
f[site].r = r;
f[site].sum = r-l+1;
if(l == r)
return ;
int mid = (l+r)>>1;
Bulid(l, mid, site<<1);
Bulid(mid+1, r, site<<1|1);
}
int Search(int site, int num)
{
f[site].sum--;
if(f[site].l == f[site].r)
return f[site].l;
if(f[site<<1].sum >= num)
return Search(site<<1, num);
else
return Search(site<<1|1, num-f[site<<1].sum);
}
int main()
{
int n, k;
while(scanf("%d %d",&n, &k) != EOF)
{
Bulid(1, n, 1);
int p;
int _max = 0;
for(int i = 1; i <= n; i++)
scanf("%s %d",name[i], &vis[i]);
int i = 0;
while(1)
{
if(RPrime[i] > n)
{
p = RPrime[i-1];
_max = fact[i-1];
break;
}
i++;
}
int t;
for(i = 0; i < p; i++)
{
n--;
t = Search(1,k);
if(!n)
break;
if(vis[t] > 0)
k=(k-1+vis[t]-1)%n+1;
else
k=((k-1+vis[t])%n+n)%n+1;
}
cout<<name[t]<<" "<<_max<<endl;
}
return 0;
}
相關文章
- POJ 3468 A Simple Problem with Integers(線段樹區間操作)
- POJ 2991 Crane(線段樹+計算幾何)
- POJ 3468 A Simple Problem with Integers (線段樹 區間更新)
- POJ 3468 A Simple Problem with Integers (線段樹 區間共加)
- POJ 3468-A Simple Problem with Integers(區間更新線段樹)
- POJ 2777 Count Color 線段樹入門題
- POJ 2828 Buy Tickets 線段樹入門(建樹稍微有點抽象)抽象
- 數列求和【線段樹基礎】
- 線~段~樹
- 線段樹
- POJ 2528 Mayor's posters (線段樹 區間更新+離散化)
- POJ 2582 Mayor's posters 線段樹入門題+離散化
- POJ 2528 Mayor's posters (線段樹區間更新 + 離散化)
- TZOJ 8472 : Tree (重鏈剖分+線段樹) POJ 3237
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- POJ 2777-Count Color(線段樹-區間染色查詢)
- 線段樹 hate it
- 【模版】線段樹
- 01 線段樹
- 線段樹--RMQMQ
- 李超線段樹
- 線段樹模板
- POJ 3264-Balanced Lineup詳解(線段樹區間求值)
- POJ 3264 Balanced Lineup 線段樹入門(點的查詢)
- poj 2010 Moo University - Financial Aid (貪心+線段樹)NaNAI
- 線段樹維護區間等差數列
- ut.cpp 最大線段並減線段交 [線段樹]
- 線段樹筆記筆記
- 線段樹入門
- 權值線段樹
- 線段樹進階
- POJ 4048 Chinese Repeating Crossbow(線段相交)ROS
- 2010/10/25 誰吃香甜餅乾? Who Gets the Cookies?Cookie
- 線段樹(毒瘤)總結
- 線段樹模板總結
- 深入理解線段樹
- 線段樹入門理解
- 線段樹(超詳解)