求$\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. CentOS7.2 安装nginx-1.10.3

    nginx-1.10.3 下载nginx 检查是否安装了依赖库: [root@localhost ~]# rpm -q gcc gcc-4.8.5-11.el7.x86_64 [root@localh ...

  2. Mac下配置Hive环境

    在配置Hive环境之前,需要Hadoop环境. 安装Hive 点击下载 下载结束后,会有一个.tar文件,使用以下命令解压该文件. tar -zxvf 要解压的tar包 解压完成后如下 修改Hive配 ...

  3. Gym 101147A The game of Osho(SG找规律)

    https://vjudge.net/problem/Gym-101147A 题意:给出G组数,每组数包括两个数B,N,两玩家轮流取数,使得N-num,num<=N并且num是N的整次幂.判断谁 ...

  4. POJ Stockbroker Grapevine(floyd)

    https://vjudge.net/problem/POJ-1125 题意: 题意不是很好理解,首先输入一个n,表示有n个股票经纪人,接下来输入n行,每行第一个数m为该股票经纪人认识的经纪人数,然后 ...

  5. JQuery 实现下拉列表选中

    html代码如下: <select id="category" name="category"> <option value="&q ...

  6. python 复数的数学四则运算

    print(+3j)+(-7j)) print(+3j)-(-7j)) print(+3j)*(-7j)) print(+3j)/(-7j))

  7. 将input type="file" 类型的图片文件转成base64

    带有图片的form表单上传数据是很麻烦的,因为图片通常都是和文字分开上传,这是很麻烦的,所有吧图片转成base64就可以和当成文字上传了.话不多少,看代码: 首先定义一个类型为file的input标签 ...

  8. Linux Mint 18.1安装nvidia驱动

    硬件环境:Dell Inspiron 7557笔记本(i7,8G,GTX960M) 软件环境:Linux Mint 18.1(基于Ubuntu 16.04) 问题描述: Linux Mint 18.1 ...

  9. js数字进制转换

    其他进制转十进制: 使用 parseInt()函数,parseInt解析一个字符串参数,并返回一个指定基数的整数 ,用法如下: parseInt(string, radix); 以二进制为例,用法如下 ...

  10. Fly Vim, First-Class

    http://corner.squareup.com/2013/08/fly-vim-first-class.html Engineers at Square use a wide variety o ...