求$\frac{b_1b_2b_3...b_m}{a_1a_2a_3...a_m}\%M$

M<=1e18,m<=100000,数据组数<=50

用pollard-rho分解M的质因数,提取出$b_i,a_i$与M不互质的部分处理一下

#include<cstdio>
#include<algorithm>
typedef long long i64;
typedef long double ld;
char buf[],*ptr=buf+;
int G(){
if(buf+==ptr)fread(ptr=buf,,,stdin);
return *ptr++;
}
i64 _(){
i64 x=;
if(ptr-buf<){
while(*ptr<)++ptr;
while(*ptr>)x=x*+(*ptr++)-;
}else{
int c=G();
while(c<)c=G();
while(c>)x=x*+c-,c=G();
}
return x;
}
int n,m,k;
i64 b[],a[][];
int fp,ts[];
i64 fs[];
i64 mul(i64 a,i64 b,i64 c){
if(c<=2000000000ll)return a*b%c;
i64 r=a*b-i64(ld(a)/c*b)*c;
if(r>=c||r<=-c)r%=c;
return r>=?r:r+c;
}
i64 pw(i64 a,i64 n,i64 P){
i64 v=;
for(;n;n>>=,a=mul(a,a,P))if(n&)v=mul(v,a,P);
return v;
}
i64 gcd(i64 a,i64 b){
if(a<)a=-a;
for(i64 c;b;c=a,a=b,b=c%b);
return a;
}
bool mr(i64 n){
i64 z=n-;
int t=;
while(~z&)z>>=,++t;
for(int i=;i<;++i){
i64 a=rand()%(n-)+;
i64 x=pw(a,z,n);
for(int j=;j<t;++j){
i64 y=mul(x,x,n);
if(y==&&x!=&&x!=n-)return ;
x=y;
}
if(x!=)return ;
}
return ;
}
i64 get(i64 x,int c){
int i=,j=;
i64 a=(rand()^i64(rand())<<)%(x-)+,b=a;
while(){
a=mul(a,a,x);
if((a+=c)>=x)a%=x;
i64 p=gcd(a-b,x);
if(p!=)return p;
if((++i)==j)j<<=,b=a;
}
}
void calc(i64 n){
if(n==)return;
if(mr(n)){
fs[fp++]=n;
return;
}
for(int c=;;++c){
i64 a=get(n,c);
if(a!=n){
i64 b=gcd(a,n/a);
calc(a/b);
calc(n/a/b);
calc(b);
return;
}
}
}
i64 cal(i64*b,i64*a,i64 M){
fp=;
calc(M);
std::sort(fs,fs+fp);
fp=std::unique(fs,fs+fp)-fs;
i64 phi_M=M;
for(int i=;i<fp;++i)ts[i]=,phi_M=phi_M/fs[i]*(fs[i]-);
i64 B=,A=,x;
for(int i=;i<=m;++i){
x=b[i];
if(fs[]==)for(;~x&;x>>=,++ts[]);
for(int j=(fs[]==);j<fp;++j){
for(i64 p=fs[j],y=x/p;y*p==x;x=y,y=y/p,++ts[j]);
}
B=mul(B,x,M);
}
for(int i=;i<=m;++i){
x=a[i];
if(fs[]==)for(;~x&;x>>=,--ts[]);
for(int j=(fs[]==);j<fp;++j){
for(i64 p=fs[j],y=x/p;y*p==x;x=y,y=y/p,--ts[j]);
}
A=mul(A,x,M);
}
B=mul(B,pw(A,phi_M-,M),M);
for(int i=;i<fp;++i){
if(ts[i]<)return -;
B=mul(B,pw(fs[i],ts[i],M),M);
}
return B;
}
int main(){
srand();
n=_();m=_();k=_();
for(int i=;i<=m;++i)b[i]=_();
for(int t=;t<=n;++t)
for(int i=;i<=m;++i)a[t][i]=_();
for(int i=;i<k;++i){
int x=_();
i64 M=_();
printf("%lld\n",cal(b,a[x],M));
}
return ;
}

bzoj4891: [Tjoi2017]龙舟的更多相关文章

  1. BZOJ4891 TJOI2017龙舟(Polllard-Rho)

    对给定模数分解质因数后约分即可.依然常数巨大过不了. #include<iostream> #include<cstdio> #include<cmath> #in ...

  2. BZOJ4891:[TJOI2017]龙舟(Pollard-Rho,exgcd)

    Description 加里敦大学有一个龙舟队,龙舟队有n支队伍,每只队伍有m个划手,龙舟比赛是一个集体项目,和每个人的能力息息相关,但由于龙舟讲究配合,所以评价队伍的能力的是一个值c = (b1*b ...

  3. 【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)

    [BZOJ4891][TJOI2017]龙舟(Pollard_rho) 题面 BZOJ 洛谷 题解 看了半天题....就是让你求\(\frac{b}{a}\)在模\(M\)意义下的值... 首先把\( ...

  4. BZOJ_4892_[Tjoi2017]dna_哈希

    BZOJ_4892_[Tjoi2017]dna_哈希 Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员 ...

  5. bzoj4892 [TJOI2017]DNA

    bzoj4892 [TJOI2017]DNA 给定一个匹配串和一个模式串,求模式串有多少个连续子串能够修改不超过 \(3\) 个字符变成匹配串 \(len\leq10^5\) hash 枚举子串左端点 ...

  6. 【BZOJ4890】[TJOI2017]城市(动态规划)

    [BZOJ4890][TJOI2017]城市(动态规划) 题面 BZOJ 洛谷 题解 数据范围都这样了,显然可以暴力枚举断开哪条边. 然后求出两侧直径,暴力在直径上面找到一个点,使得其距离直径两端点的 ...

  7. 【BZOJ4887】[TJOI2017]可乐(矩阵快速幂)

    [BZOJ4887][TJOI2017]可乐(矩阵快速幂) 题面 BZOJ 洛谷 题解 模板题??? #include<iostream> #include<cstdio> # ...

  8. P1083龙舟比赛

    题目如下: 现在正在举行龙舟比赛,我们现在获得了最后冲刺时的俯视图像,现在你要输出各条龙舟的名次. 这张图像由r行c列的字符组成,每行的最左边的字符表示起点,所以字符为'S',最右边的字符为'F'.并 ...

  9. 【BZOJ4888】[TJOI2017]异或和(树状数组)

    [BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...

随机推荐

  1. SQL 中 not in 查询不到数据问题

    在开发的过程中,遇到过not in 始终查询不到数据问题 select * from T_CustomerInfo where CustomerID not in (select CustomerID ...

  2. cf 429 B Working out

    B. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  3. Mac下安装hexo Error: Cannot find module './build/Release/DTraceProviderBindings 解决

    参考: Github:Mac 下已经装了hexo,仍旧报错 官方文档 $ npm install hexo --no-optional if it doesn't work try $ npm uni ...

  4. Codeforces Round #394 (Div. 2) C.Dasha and Password(暴力)

    http://codeforces.com/contest/761/problem/C 题意:给出n个串,每个串的初始光标都位于0(列)处,怎样移动光标能够在凑出密码(每个串的光标位置表示一个密码的字 ...

  5. python学习笔记(断言assert)

    最近有了些时间 博主一直在python的unittest框架,这次想看看其他框架 先准备熟悉熟悉 pytest,由于unittest有自己断言方法 而pytest则是使用python自带的 asser ...

  6. 一定要用Windows自带的记事本编辑 applicationHost.config

    访问IIS时,发生了一个 HipIISEngineStub.dll不能读取的问题.(Windows Event可以确认). 很容易在网上找到了对策, http://chrisfleischhacker ...

  7. C#接口作用

    1.C#接口的作用 : C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正 ...

  8. socket中 emit和on的写法

    socket.emit('action');表示发送了一个action命令,命令是字符串的,在另一端接收时,可以这么写: socket.on('action',function(){...});soc ...

  9. 记录vue中一些有意思的坑

    记录vue中一些有意思的坑 'message' handler took 401ms 在出现这个之前,我一直纠结于 是如何使用vue-router或者不使用它,通过类似的v-if来实现.结果却出现这个 ...

  10. jquery属性值选择器

    $("[attribute|='value']") 选择指定属性值等于给定字符串或改字符串为前缀(该字符串后跟一个连字符“-”)的元素. attribute: 一个属性名 valu ...