bzoj 3283 扩展BSGS + 快速阶乘
T2 扩展BSGS
T3 快速阶乘
给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc
考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题。
/**************************************************************
Problem: 3283
User: idy002
Language: C++
Result: Accepted
Time:1704 ms
Memory:12380 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <cmath> typedef long long dnt;
void exgcd( dnt a, dnt b, dnt &d, dnt &x, dnt &y ) {
if( b== ) {
x=, y=, d=a;
} else {
exgcd(b,a%b,d,y,x);
y-=a/b*x;
}
}
dnt inv( int a, int n ) {
dnt d, x, y;
exgcd(a,n,d,x,y);
return d== ? (x%n+n)%n : -;
}
dnt mpow( dnt a, dnt b, dnt c ) {
dnt rt;
for( rt=; b; b>>=,a=a*a%c )
if( b& ) rt=rt*a%c;
return rt;
} namespace Task1 {
void sov( dnt a, dnt b, dnt c ) {
printf( "%lld\n", mpow(a,b,c) );
}
};
namespace Task2 {
const int mod = ;
const int len = mod<<;
struct Hash {
int head[mod], val[len], rat[len], next[len], ntot;
void init() {
ntot=;
memset( head, , sizeof(head) );
}
void insert( int v, int r ) {
int k = v % mod;
ntot++;
next[ntot] = head[k];
val[ntot] = v;
rat[ntot] = r;
head[k] = ntot;
}
int query( int v ) {
int k = v % mod;
for( int t=head[k]; t; t=next[t] )
if( val[t]==v ) return rat[t];
return -;
}
}hash; dnt gcd( dnt a, dnt b ) {
return b ? gcd(b,a%b) : a;
}
int bsgs( dnt s, dnt a, dnt b, dnt c ) {
hash.init();
int m = ceil(sqrt(c));
for( int i=; i<m; i++ ) {
if( s==b ) return i;
hash.insert( s, i );
s = s*a % c;
}
dnt am = ;
for( int i=; i<m; i++ )
am = am*a % c;
am = inv(am,c);
b = b*am % c;
for( int i=m; i<c; i+=m ) {
int j = hash.query( b );
if( j!=- ) return i+j;
b = b*am % c;
}
return -;
}
int exbsgs( dnt a, dnt b, dnt c ) {
dnt s = ;
for( int i=; i<; i++ ) {
if( s==b ) return i;
s = s*a % c;
}
dnt cd;
s = ;
int rt = ;
while( (cd=gcd(a,c))!= ) {
rt++;
s*=a/cd;
if( b%cd ) return -;
b/=cd;
c/=cd;
s%=c;
}
int p = bsgs(s,a,b,c);
if( p==- ) return -;
return rt + p;
}
void sov( int a, int b, int c ) {
int res = exbsgs(a,b,c);
if( res==- ) printf( "Math Error\n" );
else printf( "%d\n", res );
}
};
namespace Task3 {
struct Pair {
int s, k;
Pair( int s, int k ):s(s),k(k){}
};
dnt aa[], mm[];
dnt pres[];
dnt pp[], cc[], ppp[], tot; dnt china( int n, dnt *a, dnt *m ) {
int M=;
for( int i=; i<n; i++ )
M *= m[i];
int rt = ;
for( int i=; i<n; i++ ) {
dnt Mi = M/m[i];
rt = (rt+Mi*inv(Mi,m[i])*a[i]) % M;
}
return rt;
}
void init( int p, int pp ) {
pres[] = ;
for( int i=; i<=pp; i++ ) {
if( i%p== ) {
pres[i] = pres[i-];
} else {
pres[i] = pres[i-]*i % pp;
}
}
}
Pair split( int n, int p, int c, int pp ) {
int b = n/p;
if( b== ) {
return Pair( pres[n], );
} else {
Pair pr = split( b, p, c, pp );
return Pair( (pr.s*pres[n%pp]%pp) * mpow(pres[pp],n/pp,pp) % pp, pr.k+b );
}
}
void sov( int m, int n, int c ) {
tot = ;
for( int i=; i*i<=c; i++ ) {
if( c%i== ) {
pp[tot] = i;
cc[tot] = ;
ppp[tot] = ;
while( c%i== ) {
cc[tot]++;
ppp[tot] *= pp[tot];
c/=i;
}
tot++;
}
}
if( c!= ) {
pp[tot] = c;
cc[tot] = ;
ppp[tot] = c;
tot++;
c = ;
}
for( int i=; i<tot; i++ ) {
init(pp[i],ppp[i]);
Pair pn = split( n, pp[i], cc[i], ppp[i] );
Pair pa = split( m, pp[i], cc[i], ppp[i] );
Pair pb = split( n-m, pp[i], cc[i], ppp[i] );
if( pn.k-pa.k-pb.k >= cc[i] ) {
aa[i] = ;
mm[i] = ppp[i];
} else {
aa[i] = pn.s * (inv(pa.s,ppp[i])*inv(pb.s,ppp[i])%ppp[i]) % ppp[i];
for( int j=; j<pn.k-pa.k-pb.k; j++ )
aa[i] = (dnt) aa[i]*pp[i] % ppp[i];
mm[i] = ppp[i];
}
}
/*
fprintf( stderr, "tot=%d\n", tot );
for( int i=0; i<tot; i++ )
fprintf( stderr, "%d %d\n", aa[i], mm[i] );
*/
printf( "%lld\n", china(tot,aa,mm) );
}
}; int main() {
int n;
scanf( "%d", &n );
for( int i=,opt,y,z,p; i<=n; i++ ) {
scanf( "%d%d%d%d", &opt, &y, &z, &p );
if( opt== )
Task1::sov( y, z, p );
else if( opt== )
Task2::sov( y, z, p );
else
Task3::sov( y, z, p );
}
}
bzoj 3283 扩展BSGS + 快速阶乘的更多相关文章
- bzoj 2480——扩展BSGS
题意 给定 $a,b$ 和模数 $p$,求整数 $x$ 满足 $a^x \equiv b(mod \ p)$,不保证 $a,p$ 互质. (好像是权限题,可见洛谷P4195 分析 之前讲过,可以通过 ...
- bzoj 3283: 运算器 扩展Baby Step Giant Step && 快速阶乘
3283: 运算器 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 184 Solved: 59[Submit][Status][Discuss] D ...
- poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】
扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...
- BSGS与扩展BSGS
BSGS \(BSGS\)算法又称大步小步\((Baby-Step-Giant-Step)\)算法 \(BSGS\)算法主要用于解以下同余方程 \[A^x\equiv B(mod\ p)\]其中\(( ...
- BSGS&扩展BSGS
BSGS 给定\(a,b,p\),求\(x\)使得\(a^x\equiv b \pmod p\),或者说明不存在\(x\) 只能求\(\gcd(a,p)=1\)的情况 有一个结论:如果有解则必然存在\ ...
- POJ 3243 Clever Y 扩展BSGS
http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...
- BSGS和扩展BSGS
BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...
- 扩展BSGS求解离散对数问题
扩展BSGS用于求解axΞb mod(n) 同余方程中gcd(a,n)≠1的情况 基本思路,将原方程转化为a与n互质的情况后再套用普通的BSGS求解即可 const int maxint=((1< ...
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
随机推荐
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- LVS ARP广播产生的问题和处理方式【转】
转自 LVS ARP广播产生的问题和处理方式-htckiller2010-ChinaUnix博客http://blog.chinaunix.net/uid-24960107-id-193084.htm ...
- Codeforces 859E Desk Disorder 并查集找环,乘法原理
题目链接:http://codeforces.com/contest/859/problem/E 题意:有N个人.2N个座位.现在告诉你这N个人它们现在的座位.以及它们想去的座位.每个人可以去它们想去 ...
- tf.sequence_mask
tf.sequence_mask >>> x=[1,2,3]>>> z=tf.sequence_mask(x)>>> sess.run(z)arr ...
- windows7+cuda8+cudnn6+python36+tensorflow_gpu1.4配置
下载文件 cuda8,自行网上下载online的安装包就好了 cudnn6 python36 tensorflow_gpu 下载地址:https://pan.baidu.com/s/1mjwOi5E ...
- Matlab读取txt中用空格分隔的数据文件到矩阵
转载...哪儿 忘记了 由于要做的项目中涉及到数据处理,初涉及到matlab.今天需要把一组只用空格分开的数据读取到一个三维矩阵,然后对这个矩阵进行处理. 思路是:首先用importdata读入txt ...
- windows下同时安装python2和python3
之前学习的时候使用2.7比较多. 想练习3.7的时候,两个版本兼容的问题,苦恼了几天. 查了一下资料,发现了一个很好的方法.记录一下,也做一个分享. 本篇内容主要讲一下,在同一台电脑上如何同时安装Py ...
- jQuery选择器详解及实例---《转载》
选择器是jQuery最基础的东西,本文中列举的选择器基本上囊括了所有的jQuery选择器,也许各位通过这篇文章能够加深对jQuery选择器的理解,它们本身用法就非常简单,我更希望的是它能够提升个人编写 ...
- linux用户操作
1.用户种类 Linux具有三种用户: 超级管理员root:具有最高权限,UID=0 GID=0伪用户(System Account):(UID=1~499)普通用户(login-Account): ...
- **CodeIgniter-cURL扩展
Work with cURL easily from your CodeIgniter application. Tweet Contributor : philsturgeon Email : Lo ...