BZOJ4891:[TJOI2017]龙舟(Pollard-Rho,exgcd)
Description
加里敦大学有一个龙舟队,龙舟队有n支队伍,每只队伍有m个划手,龙舟比赛是一个集体项目,和每个人的能力息息相关,但由于龙舟讲究配合,所以评价队伍的能力的是一个值c = (b1*b2...*bm)/(a1*a2...*am),其中bi表示第i个位置标准能力值,ai表示在队伍中第i个位置的划手的能力值。最 后通过约分,我们会得到c= B/A,其中gcd(B,A)=1,即A, B是互质的,
但是由于比赛现场的情况不一样,我们认为在现场压力为M的情况下,队伍最后的表现情况认为是C=1(mod M)我们规定在模M的条件下1/x = y,其中y满足xy=1(mod M)并且y是大于等于0,并且小于M的值,如果不存在这 样的y我们就认为在M的条件下这支队伍会发挥失常(即y是x在模M意义下的逆元,如果不存在逆元我们认为队伍发挥失常)。现在是这个赛季的比赛安排情况,现在教练组想知道各队的在比赛中表现情况。
Input
第一行输入三个个整数n, m,k,表示有n支队伍,每支队伍有m个人组成,有k场比赛
第二行输入m个整数,第i个表示表征第i个位置的标准能力值为bi
第3行到第n +2行,共n行,每行有m个数,第2+i行第j个数表示第i支队伍的 第j个位置的划手的能力值
第n + 3行到第n + k + 2行,共n行,每行有两个数x,M,分别表示第x支队伍 会在压力为M的比赛中出战
Output
共k行,第i行表示在第i个参赛安排种队伍的现场表现情况C,如果出现队伍发挥失常,输出“-1”
Sample Input
5 2 3
3 2 3
2 3 2
1 4
2 4
1 7
Sample Output
-1
4
HINT
对于20%的数据,1<M,ai,bi<10^8,m<=100
对于100%的数据,1<M,ai,bi<2*10^8,m<=10000,n<=20,k<=50
Solution
$Pollard-Rho$。
首先对于每次询问,先把$M$质因数分解一下,然后在分子和分母上分别用那些质因数去分解,并且开个桶存一下质因子的出现情况。如果分解完某个质因子在分母上还存在(也就是桶中的个数为负数),那显然$M$和分母不互质,无解输出$-1$。
否则就可以用$exgcd$把逆元给解出来,然后输出就好了QwQ
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#define N (10009)
#define LL long long
using namespace std; LL n,m,k,x,y,c,M,cnt,ans,inv;
LL a[][N],b[N],Num[N],Keg[N];
LL prime[]={,,,,,,,,}; LL Mul(LL a,LL b,LL MOD)
{
LL tmp=a*b-(LL)((long double)a*b/MOD+0.1)*MOD;
return tmp<?tmp+MOD:tmp;
} LL Qpow(LL a,LL b,LL MOD)
{
LL ans=;
while (b)
{
if (b&) ans=Mul(ans,a,MOD);
a=Mul(a,a,MOD); b>>=;
}
return ans;
} LL gcd(LL a,LL b) {return b==?a:gcd(b,a%b);} void exgcd(LL a,LL b,LL &x,LL &y)
{
if (!b) {x=; y=; return;}
exgcd(b,a%b,y,x); y-=x*(a/b);
} bool Miller_Rabin(LL n)
{
if (n==) return ;
if (n< || n%==) return ;
LL m=n-,l=;
while (m%==) m>>=,l++;
for (int i=; i<; ++i)
{
LL p=prime[i],w=Qpow(p,m,n);
if (w== || w==n- || p==n) continue;
for (int j=; j<=l; ++j)
{
LL u=Mul(w,w,n);
if (u== && w!= && w!=n-) return ;
w=u;
}
if (w!=) return ;
}
return ;
} LL Pollard_Rho(LL n,LL c)
{
LL x=rand()%n,y=x,p=,k=;
for (int i=; p==; ++i)
{
x=(Mul(x,x,n)+c)%n;
p=x>y?x-y:y-x;
p=gcd(p,n);
if (i==k) y=x, k+=k;
}
return p;
} void Solve(LL n)
{
if (n==) return;
if (Miller_Rabin(n)) {Num[++cnt]=n; return;}
LL t=n;
while (t==n) t=Pollard_Rho(n,rand()%(n-)+);
Solve(t); Solve(n/t);
} int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for (int i=; i<=m; ++i)
scanf("%lld",&b[i]);
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
scanf("%lld",&a[i][j]);
while (k--)
{
for (int i=; i<=cnt; ++i) Keg[i]=;
cnt=; ans=; inv=;
scanf("%lld%lld",&x,&M);
Solve(M);
sort(Num+,Num+cnt+);
cnt=unique(Num+,Num+cnt+)-Num-;
for (int i=; i<=m; ++i)
{
LL tmp=b[i];
for (int j=; j<=cnt; ++j)
while (tmp%Num[j]==) Keg[j]++, tmp/=Num[j];
ans=Mul(ans,tmp,M);
}
for (int i=; i<=m; ++i)
{
LL tmp=a[x][i];
for (int j=; j<=cnt; ++j)
while (tmp%Num[j]==) Keg[j]--, tmp/=Num[j];
inv=Mul(inv,tmp,M);
}
bool flag=true;
for (int i=; i<=cnt; ++i)
if (Keg[i]<) flag=false;
if (!flag) {puts("-1"); continue;}
for (int i=; i<=cnt; ++i)
if (Keg[i]) ans=Mul(ans,Qpow(Num[i],Keg[i],M),M);
exgcd(inv,M,x,y); inv=(x%M+M)%M;
printf("%lld\n",Mul(ans,inv,M));
}
}
BZOJ4891:[TJOI2017]龙舟(Pollard-Rho,exgcd)的更多相关文章
- BZOJ4891 TJOI2017龙舟(Polllard-Rho)
对给定模数分解质因数后约分即可.依然常数巨大过不了. #include<iostream> #include<cstdio> #include<cmath> #in ...
- bzoj4891: [Tjoi2017]龙舟
求$\frac{b_1b_2b_3...b_m}{a_1a_2a_3...a_m}\%M$ M<=1e18,m<=100000,数据组数<=50 用pollard-rho分解M的质因 ...
- 【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)
[BZOJ4891][TJOI2017]龙舟(Pollard_rho) 题面 BZOJ 洛谷 题解 看了半天题....就是让你求\(\frac{b}{a}\)在模\(M\)意义下的值... 首先把\( ...
- 【Luogu】P4358密钥破解(Pollard Rho)
题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- Pollard Rho因子分解算法
有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- 初学Pollard Rho算法
前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...
随机推荐
- 撩课-Web大前端每天5道面试题-Day22
1.mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合? mvc和mvvm其实区别并不大. 都是一种设计思想. 主要就是mvc中Controller演变成mvvm中的view ...
- ActiveMQ Could not connect to broker URL
javax.jms.JMSException: Could not connect to broker URL: http://localhost:8161/. Reason: java.io.IOE ...
- tcpcopy + tcpdump 离线回放
简单来说,就是用tcpdump记录线上请求,用tcpcopy来重放,如下图所示: 有关 tcpdump 的命令详解请参考: http://www.cnblogs.com/ggjucheng/arc ...
- WinForm窗体多线程操作实例
最近在学习C# 多线程相关知识,这块一直比较薄弱,在网上查了一下资料,学习了一下前辈们的经验,小弟自己也比葫芦画瓢的写了一个,自学一下. 代码如下 using System; using System ...
- elasticsearch安装指导(new)
1 直接去官网下载rpm包安装或者下载tar包 2 服务启动后,发现打不开页面,修改yml文件即可 用rpm包安装的软件有一个特点就是不同的目录在不同文件夹,比如config文件夹根据下面进程信息查到 ...
- 第二十四天- 模块导入 import from xxx import xxx
# 模块:# 模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块的名字加上.py后缀# 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀个模块# 为何用模块:写大项目时,把相关的功能进⾏分 ...
- 前端微信小程序实战篇
电商底部导航栏的制作 我想大家对电商一定不陌生,一般电商的底部导航栏有以下几个首页.分类.购物车.个人中心. app.json是用来配置page路径以及导航栏属性的,那我们要做首页.分类.购物车.个人 ...
- oracle exp dmp
exp help=yconn scott/tiger;select * from tab;create table student(sno int, sname varchar2(10), sage ...
- pycharm 调试Django 奇葩问题:Process finished with exit code -1073741819
想自己整个BLOG,发现python+Django好像还不错,尝试一下.在使用过程中,突然pycharm不能调试django工程.网上搜索也没解决,是google哦.好像记得启动pycharm时,看到 ...
- 4.Spring——xml配置文件
如果使用Maven构建项目,spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件), 如果没有找到,才会转向去URL指定的路径下载.ap ...