博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2976 : [Poi2002]出圈游戏
阅读量:6083 次
发布时间:2019-06-20

本文共 795 字,大约阅读时间需要 2 分钟。

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

 

#include
#define N 30int 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;}

  

转载地址:http://fezwa.baihongyu.com/

你可能感兴趣的文章
Windows Server 2008 R2 IIS7 搭建PHP环境
查看>>
任务计划
查看>>
交换机杂记
查看>>
shell编程总结
查看>>
我的友情链接
查看>>
Java内存与垃圾回收调优
查看>>
Java 8新特性:Stream API
查看>>
swing和java里嵌入浏览器
查看>>
android之SoundPool
查看>>
Python学习-反射相关函数
查看>>
ubuntu11.10安装五笔输入法
查看>>
我的友情链接
查看>>
解决zabbix_get 获取不到自定义key一例
查看>>
DBNULL和NULL
查看>>
Confluence 6 有关 AD 的一些特殊说明
查看>>
linux系统管理之五:开机、关机、服务状态及系统密码修改
查看>>
Windows环境下的NodeJS+NPM+Bower安装配置
查看>>
LeetCode:Valid Number - 判断字符串中内容是否为数字
查看>>
Android 4.0 硬件加速
查看>>
Windows XP与NTP服务器自动更新时间的调整
查看>>