求$\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. anaconda + tensorflow +ubuntu 超级菜鸟,大家多指正【转】

    本文转载自:https://blog.csdn.net/zzw000000/article/details/51203331 1.首先安装Anaconda 下载linux对应的anaconda版本,下 ...

  2. windows10添加开机自启动程序

    1. 将要启动的程序创建快捷方式 2. 将创建的快捷方式放到以下文件夹中 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

  3. Linux的硬链接和软链接

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link), 也就是软链接.默认情况下,ln命令产生硬链接. [硬连接]硬连 ...

  4. class []的用法

    span[class='test']    =>匹配所有带有class类名test的span标签 span[class *='test']  =>匹配所有包含了test字符串的class类 ...

  5. H5 canvas控制坦克移动

    接着上一篇(http://www.cnblogs.com/zhouhuan/p/H5_tankgame.html),这一篇研究一下怎么响应玩家的操作让坦克进行相应的移动.   1. 了解keydown ...

  6. Libpacp 深度剖析

    Libpacp 深度剖析 1. Libpacp 的工作原理 ​ Libpcap的工作原理可以描述为,当一个数据包到达网卡时,通过网络分接口(即旁路机制)将数据包发给BPF过滤器,匹配通过的数据包可以被 ...

  7. ThinkPHP 3.2 调用自定义函数库

    ThinkPHP3.2 和3.1 区别还是有点大的 引入了命名空间,强化了驱动化和行为,增强了模块化的概念和对云平台的支持,并改进了诸多的细节.主要改进包括:模块化架构的全新设计全新命名空间和自动导入 ...

  8. IOS-网络(文件上传)

    // // ViewController.m // IOS_0206_文件上传 // // Created by ma c on 16/2/6. // Copyright © 2016年 博文科技. ...

  9. HTTP相关知识点

    一.工作原理       HTTP协议工作于客户端-服务器架构上.浏览器作为HTTP客户端通过URL向HTTP服务端(即web服务端)发送所有请求. Web服务器接收到请求后,向客户端发送相应的响应信 ...

  10. MySQL多表关联查询与存储过程

    --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...