[数论 CRT] BZOJ 2976 [Poi2002]出圈游戏
2016-04-18 18:27
387 查看
CA爷把这道题搬到了BC上,据说因为题目描述有误炸了,于是就来做做
就是一同余方程组
用中国剩余定理解
但是自己的CRT打得好low
就是一同余方程组
用中国剩余定理解
但是自己的CRT打得好low
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define cl(x) memset(x,0,sizeof(x)) using namespace std; typedef long long ll; typedef pair<ll,ll> abcd; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(ll &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } int pnum=8; int prime[10]={0,2,3,5,7,11,13,17,19}; int cnt; ll NN; ll A[25],N[25],C[25]; ll p[25],q[25],tp[25]; inline abcd EXGCD(ll x,ll y){ abcd ret; if (x<y) { ret=EXGCD(y,x); return abcd(ret.second,ret.first); } if (y==0) return abcd(1,0); ret=EXGCD(y,x%y); return abcd(ret.second,ret.first-x/y*ret.second); } inline ll inv(ll a,ll p){ return ((EXGCD(a,p).first)%p+p)%p; } inline ll CRT(){ ll ret; cnt=0; for (int i=1;i<=8;i++) { ll itmp=1; for (int j=1;j<=q[i];j++) itmp*=prime[i]; if (itmp!=1) A[++cnt]=p[i],N[cnt]=itmp; } NN=1; for (int i=1;i<=cnt;i++) NN*=N[i]; for (int i=1;i<=cnt;i++) { C[i]=1; for (int j=1;j<=cnt;j++) if (i!=j) { (C[i]*=N[j])%=NN; (C[i]*=inv(N[j],N[i]))%=NN; } } ret=0; for (int i=1;i<=cnt;i++) (ret+=A[i]*C[i]%NN)%=NN; if (ret==0) ret=NN; return ret; } ll mod[25]; inline bool Add(ll ia,ll in){ mod[in]=ia%in; for (int i=1;i<=pnum;i++) if (in%prime[i]==0) { ll itmp=0,ip=1; while (in%prime[i]==0) itmp++,in/=prime[i],ip*=prime[i]; if (q[i]<itmp) { q[i]=itmp; p[i]=ia%ip; } } return 1; } ll n; ll a[25]; ll flag[25]; inline bool Check(){ for (int i=n;i;i--) for (int j=1;j<=i;j++) if (i%j==0 && mod[i]%j!=mod[j]) return 0; return 1; } int main() { ll ix; freopen("t.in","r",stdin); freopen("t.out","w",stdout); memset(tp,-1,sizeof(tp)); read(n); for (int i=1;i<=n;i++) read(ix),a[ix]=i; int s=0; for (int i=1;i<=n;i++) { int icnt=0; for (;s!=a[i];s=(s==n)?1:s+1) if (!flag[(s==n)?1:s+1]) icnt++; Add(icnt,n-i+1); flag[a[i]]=1; } if (!Check()) printf("NIE\n"); else printf("%lld\n",CRT()); return 0; }
相关文章推荐
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- 初实nginx服务器配置之文件目录
- Sublime Text如何安装插件
- 团队作业第二次
- Must-have plugins for Ionic Framework
- 【Android测试】【随笔】与 “美丽说” 测试同事交流
- 每个程序员都需要学习 JavaScript 的7个理由
- PB字符串处理函数
- ns-allinone-3.X(simulator模拟器)简单配置
- C (day01)
- Oracle触发器表发生了变化 触发器不能读它解决方法
- JavaScript中创建对象的几种模式(原型)--源自技术
- iOS开发——纯代码界面(自定义UITableViewCell)
- mysql-explain
- NOIP2008 T3 传纸条 解题报告——S.B.S.
- MYSQLdump参数详解
- Rank() over(partition ... 分组统计的实例
- NDK工具开发Jni,Android studio jni开发
- NDK工具开发Jni,Android studio jni开发
- [分块 随机化] BZOJ 2223 [Coci 2009]PATULJCI