BZOJ 2976: [Poi2002]出圈游戏 Excrt+set
人数很少,可以直接用 $set$ 来模拟人的情况.
然后就能得到若干个方程,用 $excrt$ 进行合并即可.
#include <set>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define N 23
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
set<int>S;
set<int>::iterator it;
int edges,size,n;
int ou[N],A[N];
ll arr[N],brr[N];
bool cmp(int i,int j)
{
return ou[i]<ou[j];
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll gcd=exgcd(b,a%b,x,y),tmp=x;
x=y,y=tmp-a/b*y;
return gcd;
}
ll Excrt()
{
int i,j;
ll ans=arr[1],M=brr[1];
for(i=2;i<=n;++i)
{
ll a=M,b=brr[i],c=arr[i]-ans,x,y;
ll gcd=exgcd(a,b,x,y);
if(c%gcd)
{
return -1;
}
b=abs(b/gcd);
x=x*(c/gcd),x=(x%b+b)%b;
ans=ans+M*x;
M*=brr[i]/__gcd(brr[i],M);
ans=(ans%M+M)%M;
}
return ans;
}
int main()
{
int i,j;
// setIO("input");
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&ou[i]),A[i]=i;
}
for(i=1;i<=n;++i) S.insert(i);
sort(A+1,A+1+n,cmp);
arr[1]=A[1]-1;
brr[1]=n;
for(i=2;i<=n;++i)
{
int cnt=0,flag=0;
for(it=S.begin();;it++)
{
if((*it)==A[i-1]) break;
}
cnt=-1;
for(it++;it!=S.end();it++)
{
++cnt;
if((*it)==A[i])
{
flag=1;
break;
}
}
if(!flag)
{
for(it=S.begin();it!=S.end();it++)
{
++cnt;
if((*it)==A[i])
{
break;
}
}
}
S.erase(A[i-1]);
brr[i]=brr[i-1]-1, arr[i]=cnt;
}
ll p=Excrt();
if(p!=-1) printf("%lld\n",p+1);
else printf("NIE\n");
return 0;
}
BZOJ 2976: [Poi2002]出圈游戏 Excrt+set的更多相关文章
- BZOJ 2976: [Poi2002]出圈游戏 HDU 5668 CRT
2976: [Poi2002]出圈游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2976 Description Input 中第一 ...
- BZOJ2976:[POI2002]出圈游戏(exCRT)
Description 有编号从1到n的n个小朋友在玩一种出圈的游戏,编号为i+1的小朋友站在编号为i小朋友左边.编号为1的小朋友站在编号为n的小朋友左边.首先编号为1的小朋友开始报数,接着站在左边的 ...
- BZOJ2976 : [Poi2002]出圈游戏
首先模拟一遍得到n个同余方程,然后用扩展欧几里得求出最小的可行解即可,时间复杂度$O(n^2)$. #include<cstdio> #define N 30 int n,i,j,k,x, ...
- 华为2013校招之哈工大威海 上机试题之一:报数问题:设有N 个人围坐一圈并按顺时针方向从1 到N 编号,从第S个人开始进行1 到M报数,报 数到第 M个人时,此人出圈,再从他的下一个人重新开始1 到 M的报数,如此进行下去直 到所有的人都出圈为止。现要打印出出圈次序。
1. 报数游戏 问题描述: 设有N 个人围坐一圈并按顺时针方向从1 到N 编号,从第S个人开始进行1 到M报数,报 数到第 M个人时,此人出圈,再从他的下一个人重新开始1 到 M的报数,如此进行下去 ...
- BZOJ 1444:[JSOI2009]有趣的游戏
BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...
- 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了
链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...
- Java简单算法--出圈问题
package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的 ...
- n人围圈报数,报3出圈
题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. Scanner scanner = new Scanner(System. ...
- bzoj 5393 [HAOI2018] 反色游戏
bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...
随机推荐
- wc、iconv命令
一.wc:统计文件打印换行符,单词和字节数 语法: wc [OPTION] ... [FILE] ... wc [OPTION] ... --files0-from = F 描 ...
- dgv数据绑定后,添加行遇到过的问题并解决
1. 当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行 解决方法:((DataTable)Dgv.DataSource).Rows.Add("", ...
- sda.Update批量更新数据
老方法了,重新做个记录. string connStr = ConfigurationManager.ConnectionStrings["constring"].ToString ...
- 查找和杀掉占用GPU显存的进程
用只有2个G的显卡跑数据就需要在训练之前先把无关进程杀掉,防止跑到一半显存满了 nvidia-smi:显示当前GPU中的线程 kill -9 PID:输入PID以结束线程
- Centos7:solr伪集群(SolrCloud)搭建
JDK,tocmat环境搭建 zookeeper集群安装 解压缩zookeeper的压缩包 创建data目录 复制zoo_sample.cfg为zoo.cfg 修改confg/zoo.cfg中 dat ...
- 获取url传来的参数
//根据传递过来的参数name获取对应的值 function getParameter(name) { var reg = new RegExp("(^|&)" + nam ...
- 通过javascript得到当前的日期和计算出该班级的平均分
某班的成绩出来了,现在老师要把班级的成绩打印出来. 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的时间. 2.计算出该班级的平均分(保留整数). 同学成绩数据 ...
- 【Swift后台】环境安装
macOS 在macOS上使用Vapor,需要Xcode 9.3或更高版本.Swift 4.1或更高版本.安装还需要Homebrew命令. 检查Swift版本: swift --version Vap ...
- Scrapy框架之高级 转
一.CrawlSpider模板 创建项目 scrapy startproject 项目名称 查看模板 scrapy genspider -l 创建crawl模板 scrapy genspider -t ...
- 【转】ESXi主机出现“主机上的系统日志存储在非持久存储器中”解决办法
原址:https://blog.csdn.net/mooncarp/article/details/50923483 当ESXi主机的底层操作系统安装在SD卡上时,在vCenter中配置该主机时,如果 ...