求$\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. Java堆(heap)、栈(stack)和队列的区别

    Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...

  2. CentOS6安装Pyhon3

    一,从官方下载Python3.6 [root@linux-node1 src]# pwd /usr/local/src [root@linux-node1 src]# wget https://www ...

  3. 面向对象之php多态

    php是面向对象的脚本语言,而我们都知道,面向对象的语言具有三大特性:封装,继承,多态(接口的多种不同的实现方式即为多态). 封装是类的构建过程,php具有.php也具有继承的特性.唯独这个多态,ph ...

  4. shell 使用ping测试网络

    能ping通返回1,不能返回0 ping -c 192.168.1.1 | grep '0 received' | wc -l

  5. Java回顾之JDBC

    这篇文章里,我们来讨论一些和JDBC相关的话题. 概述 尽管在实际开发过程中,我们一般使用ORM框架来代替传统的JDBC,例如Hibernate或者iBatis,但JDBC是Java用来实现数据访问的 ...

  6. ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法

    程序连接orarle报ORA-12505错误 一.异常{ ORA-12505, TNS:listener does not currently know of SID given in connect ...

  7. HDU-1794 方格填数 (贪心+四分)

    题目大意:给一个由自然数构成的nxn方阵,其中有k个元素为0,现在要从给出的m个元素中挑出k个填入矩阵,是和的增量最大.和定义为所有子方阵上的元素之和. 题目分析:对于尺寸固定的方阵,计算和的时候每个 ...

  8. MAP 最大后验——利用经验数据获得对未观测量的点态估计

    Map (最大后验) 在贝叶斯统计学中,最大后验(Maximum A Posteriori,MAP)估计可以利用经验数据获得对未观测量的点态估计.它与Fisher的最大似然估计(Maximum Lik ...

  9. [转载]Huffman编码压缩算法

    转自http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 D ...

  10. ISE创建Microblaze软核(一)

    在使用FPGA时,有时会用到它做为主控芯片.对于习惯于单片机及C语言开发的人,使用FPGA做主控芯片,首先还是想到它的嵌入式软核功能.如果能够基于Microblze软核进行C语言程序的开发,相对于使用 ...