BZOJ2976 : [Poi2002]出圈游戏

首先模拟一遍得到n个同余方程,然后用扩展欧几里得求出最小的可行解即可,时间复杂度$O(n^2)$。

#include<cstdio>
#define N 30
int n,i,j,k,x,y,a[N],b[N],d[N],ans;
namespace Solve{
int flag=1,k=1,m=0,d,x,y;
int exgcd(int a,int b,int&x,int&y){
  if(!b)return x=1,y=0,a;
  int d=exgcd(b,a%b,x,y),t=x;
  return x=y,y=t-a/b*y,d;
}
void add(int a,int r){
  if(!flag)return;
  d=exgcd(k,a,x,y);
  if((r-m)%d){flag=0;return;}
  x=(x*(r-m)/d+a/d)%(a/d),y=k/d*a,m=((x*k+m)%y)%y;
  if(m<0)m+=y;
  k=y;
}
int ans(){
  if(!flag)return 0;
  return m?m:k;
}
}
int main(){
  scanf("%d",&n);
  for(i=1;i<=n;i++)a[i]=i,scanf("%d",&x),b[x]=i;
  for(y=1,i=n;i>1;i--){
    x=b[n-i+1];
    Solve::add(i,((a[x]-a[y]+1)%i+i)%i);
    for(d[x]=1,k=0,j=1;j<=n;j++)if(!d[j])a[j]=++k;
    for(y=x;d[j];)if((++y)>n)y=1;
  }
  if(ans=Solve::ans())printf("%d",ans);else puts("NIE");
  return 0;
}

  

时间: 2024-11-07 04:12:09

BZOJ2976 : [Poi2002]出圈游戏的相关文章

Java简单算法--出圈问题

package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的倍数就出圈,打印最后剩下的元素的原来位置 * * @author xiaoduc * */ public class Circle { public static void main(String[] args) { System.out.println("剩下元素原来的位置"+cycle

约瑟夫环问题(100围坐一圈报数,报3出圈)

100个人编号1-100,围坐一圈,从1号开始进行1,2,3报数,谁报数为3,就离开圈子,剩下的人继续报1,2,3,报数为3的出圈... 请写一段程序,计算最后一个留下来的人,他的编号 1 package com.ycl.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test1 { 7 public static void main(String[] args) { 8 int co

一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈

一 群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的 进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n, 输出最后那个大王的编号 <?php //$n猴子个数 $m第几个位置 function fn( $n, $m){ //将猴子数量放到数组内 for($i = 1; $i < $n+1; $i++){ $arr[] = $i; } $i = 0; var_d

出圈问题

题目:50个人围城一圈数到3和3的倍数时出圈,问剩下的人是谁?原来的位置是多少? 重复循环使用取余的方法: 1 import java.util.LinkedList; 2 import java.util.List; 3 4 5 public class Main { 6 public static void main(String[] args) { 7 System.out.println("该数字原来的位置是:" + cycle(50, 3)); 8 } 9 10 public

微信朋友圈游戏源码下载

2014年微信病毒营销最成功的方式之一,微信小游戏分享推广. 本人所有源码均为开源无加密,保证完整性可修改,无任何隐藏偷链链接,全网最全的游戏源码,价格合理,买过一次永久更新. 目前这一块还是蓝海一片,想加入就要赶紧了!  源码介绍: 所有源码都是html5开发,可以跨平台,无论谷歌安卓还是苹果ios都可以流畅运行,游戏可以根据自己的情况添加链接,可以分享到微信圈后跳转的你的游戏平台页.个别游戏可以设置指定次数提示添加微信账号回复指定内容获得答案.保证游戏可运行性,不像某些不良卖家价格很高买来的

约瑟夫环-一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈

一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n, 输出最后那个大王的编号(约瑟夫环). function fuhuan($allnum, $ti){ $arr = array(); for($i = 0; $i < $allnum; $i++){ $arr[$i] = $i; } $nums = 1; whi

忘了《勇者斗恶龙》,悲情亦能“酿”出好游戏

但凡说到有关龙的游戏,许多玩家和游戏研发者的第一反应就是日本的国民级游戏<勇者斗恶龙>.那款游戏从1986年上架以来,推出的各类衍生版本已经达到数十款之多,且在小说.动画和电影领域都成功拓展出超级IP(原创作品).它还是一款带给玩家欢乐的游戏,但今天我们重点谈谈另一款"勇者斗恶龙"的游戏<癌症似恶龙>. 文/张书乐(TMT行业观察者.游戏产业时评人,人民网.人民邮电报专栏作者) 刊载于<人民邮电报>2017年4月28日<乐游记>专栏141

【史上最全】微信朋友圈游戏源码下载

源码介绍:  所有源码都是html5开发,可以跨平台,无论谷歌安卓还是苹果ios都可以流畅运行,游戏可以根据自己的情况添加链接,可以分享到微信圈后跳转的你的游戏平台页.个别游戏可以设置指定次数提示添加微信账号回复指定内容获得答案.保证游戏可运行性,不像某些不良卖家价格很高买来的根本没几个能用或者很多凑数游戏. 一个简单的营利模式: 通过手机作为入口,分享某某游戏的得分到朋友圈,朋友圈内的病毒式传播速度超过你想象.然后你可以自己加入关注微信代码.百度移动广告代码.淘客代码.等等吧,可以发挥的空间非

5、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 思路:n长度的数组,boolean类型。出圈置为false,当最后只有一个true的时候,就是留下来的人。

public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入人的个数n:"); int n = sc.nextInt(); fun(n); sc.close(); } private static void fun(int n) { boolean[] ps = new boolean[n]; int co