http://poj.org/problem?id=2886
一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左边(顺时针)开始第m个孩子出去,如果是负的
那么从他的右边(也就是逆时针)开始第m个孩子出去~~~一直到所有的孩子出去,另外,第p个出去的孩子可以得到的糖果数量是p的约数个数,问能得到最多糖果的孩子的名字和得到的糖果数目
关于公约数最多的问题,可以利用到反素数,可以首先先打表反素数和对应的约数个数,找出约数最多的次数p,p肯定是不大于n的,然后就是模拟孩子出去的情况,只要模拟p次就行
然后用线段树模拟,与上一题插队差不多,记录下每个区间的人数,每次的顺序k表示第k个有人的区间更新为空
code
#include<cstdio>
using namespace std;
struct point {
int l,r;
int mark;//记录每个区间人数
};
point tree[*];
char jjc[][];
int a[],pos;
int prime[]={ //反素数
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,, };
int numb[]={ //对应的约数个数
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,
};
void build (int i,int left,int right)
{
tree[i].l=left,tree[i].r=right;
tree[i].mark=tree[i].r-tree[i].l+;
if (left==right) { return ;}
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
}
void update(int i,int ans)
{
if (tree[i].l==tree[i].r)
{
pos=tree[i].l;
tree[i].mark--;
return ;
}
if (ans<=tree[i*].mark)
update(i*,ans);
else
update(i*+,ans-tree[i*].mark);
tree[i].mark=tree[i*].mark+tree[i*+].mark;
}
int main()
{
int n,k,i,w,m;
while (scanf("%d %d",&n,&k)==)
{
for (i=;i<=n;i++)
scanf("%s %d",&jjc[i],&a[i]);
build(,,n);
w=;
for(i=;prime[i]<=n;i++)w=i;
pos=;m=prime[w];
a[]=;
while (m--)
{
int num=tree[].mark;
if (a[pos]>)
k=((k+a[pos]-)%num+num)%num+;
else
k=((k+a[pos]-)%num+num)%num+;
update(,k);
}
printf("%s %d\n",jjc[pos],numb[w]);
}
return ;
}
poj 2886 (线段树+反素数打表) Who Gets the Most Candies?的更多相关文章
-
poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
-
poj 2886 线段树的更新+反素数
Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , ...
-
POJ2886 Who Gets the Most Candies? 线段树 反素数
题意:有一群小朋友围成一个环,编号1,2,3…N.每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此.并设i为小于等于N的最大反素数,问 ...
-
POJ 2886 线段树单点更新
转载自:http://blog.csdn.net/sdj222555/article/details/6878651 反素数拓展参照:http://blog.csdn.net/ACdreamers/a ...
-
【POJ2886】Who Gets the Most Candies?-线段树+反素数
Time Limit: 5000MS Memory Limit: 131072K Case Time Limit: 2000MS Description N children are sitting ...
-
Who Gets the Most Candies?(线段树 + 反素数 )
Who Gets the Most Candies? Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d &am ...
-
POJ 2828 线段树(想法)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15422 Accepted: 7684 Desc ...
-
poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
-
POJ——3264线段树
题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,00 ...
随机推荐
-
C++ 系列:深拷贝与浅拷贝
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
-
abap常用函数
1.读取生产订单状态函数 call function 'STATUS_READ' exporting client = sy-mandt ...
-
Python Web实战 - 基于Flask实现的黄金点游戏
一.简介 团队成员: 领航者:张旭 驾驶员:张国庆 项目简介: 项目名称:基于B/S模式的黄金点游戏 采用技术: 后端:Python + Sqlite3 前端:HTML + CSS + JS + Bo ...
-
Mako
from: http://www.yeolar.com/note/2012/08/26/mako-usage/ Python模板库Mako的用法(选译自官方文档) Yeolar 2012-08-26 ...
-
ADO.NET 快速入门(二):执行命令
Commands发出针对数据库的数据存储动作.例如,你可以执行一条命令插入或者删除数据.获取更多从数据库移动数据相关的信息,请参考“Update a Database from a DataSet”. ...
-
android控制之 adb shell (已完成,不定期增加内容)
第一步:首先,下载adb1.0.32.zip,里面有如下图的内容: 第二步:解压缩,复制Adb.exe,和fastboot.exe到System32,注意AdbWinUsbApi.dll,AdbWin ...
-
20164304姜奥——Exp1 PC平台逆向破解
1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,ge ...
-
metools,个人工具站点分享
需要[加密/解密][编码/解码][生成二维码]的时候不用再进百度点广告~ 也不需要去收藏夹找网址~ 我的目的大概就是如此. 项目地址:https://github.com/yimogit/metool ...
-
js创建并下载文件
先上代码: function createAndDownloadFile(fileName, content) { var aTag = document.createElement('a'); va ...
-
golang 六宫格、九宫格头像生成
图片示例就不传了,在原WordPress上. //Merge6Grid 6宫格 //rule NO1:至少3张图 最多6张图 // NO2:第一张大小 60*60 其他大小 28*28 间隔4px 合 ...