【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)
【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)
题面
题解
看了半天题....就是让你求\(\frac{b}{a}\)在模\(M\)意义下的值。。。
首先把\(M\)分解,把\(a,b\)中的这些质因子全部分解出来,剩下的部分和\(M\)互质,直接求逆就行了,分解出来的部分如果分母大于分子,显然无逆,输出-1就行了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
ll Multi(ll x,ll y,ll MOD){ll s=x*y-(ll)((long double)x/MOD*y+0.5)*MOD;return s<0?s+MOD:s;}
ll fpow(ll a,ll b,ll MOD){ll s=1;while(b){if(b&1)s=Multi(s,a,MOD);a=Multi(a,a,MOD);b>>=1;}return s;}
bool Miller_Rabin(ll n)
{
if(n==2)return true;
for(int tim=10;tim;--tim)
{
ll a=rand()%(n-2)+2,p=n-1;
if(fpow(a,n-1,n)!=1)return false;
while(!(p&1))
{
p>>=1;ll nw=fpow(a,p,n);
if(Multi(nw,nw,n)==1&&nw!=1&&nw!=n-1)return false;
}
}
return true;
}
ll Pollard_Rho(ll n,int c)
{
ll i=0,k=2,x=rand()%(n-1)+1,y=x;
while(233)
{
++i;x=(Multi(x,x,n)+c)%n;
ll d=__gcd((y-x+n)%n,n);
if(d!=1&&d!=n)return d;
if(x==y)return n;
if(i==k)k<<=1,y=x;
}
}
void Fact(ll n,int c,vector<ll> &fac)
{
if(n==1)return;
if(Miller_Rabin(n)){fac.push_back(n);return;}
ll p=n;while(p>=n)p=Pollard_Rho(n,c--);
Fact(p,c,fac);Fact(n/p,c,fac);
}
int n,m,Q;ll a[25][10100];
int pri[100];
int main()
{
n=read();m=read();Q=read();
for(int i=0;i<=n;++i)
for(int j=1;j<=m;++j)a[i][j]=read();
while(Q--)
{
int x=read();ll MOD=read(),phi=MOD;int tot;
vector<ll> fac;Fact(MOD,233,fac);
sort(fac.begin(),fac.end());fac.resize(tot=unique(fac.begin(),fac.end())-fac.begin());
for(int i=0;i<tot;++i)phi=phi-phi/fac[i];
ll inv=1,ans=1;
for(int i=1;i<=m;++i)
{
ll p=a[0][i];
for(int j=0;j<tot;++j)
while(p%fac[j]==0)p/=fac[j],++pri[j];
ans=Multi(ans,p,MOD);
}
for(int i=1;i<=m;++i)
{
ll p=a[x][i];
for(int j=0;j<tot;++j)
while(p%fac[j]==0)p/=fac[j],--pri[j];
inv=Multi(inv,p,MOD);
}
bool fl=true;
for(int i=0;i<tot;++i)if(pri[i]<0){fl=false;break;}
if(fl)
{
for(int i=0;i<tot;++i)if(pri[i])ans=Multi(ans,fpow(fac[i],pri[i],MOD),MOD);
ans=Multi(ans,fpow(inv,phi-1,MOD),MOD);printf("%lld\n",ans);
}
else puts("-1");
for(int i=0;i<tot;++i)pri[i]=0;
}
return 0;
}
【BZOJ4891】[TJOI2017]龙舟(Pollard_rho)的更多相关文章
- BZOJ4891:[TJOI2017]龙舟(Pollard-Rho,exgcd)
Description 加里敦大学有一个龙舟队,龙舟队有n支队伍,每只队伍有m个划手,龙舟比赛是一个集体项目,和每个人的能力息息相关,但由于龙舟讲究配合,所以评价队伍的能力的是一个值c = (b1*b ...
- 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的质因 ...
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 290 Solved: 148[Submit][Status ...
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- HDU-3864 D_num Miller_Rabin和Pollard_rho
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给定一个数n,求n的因子只有四个的情况. Miller_Rabin和Pollard_rho ...
- pollard_rho和Miller_Rabin
Miller_Rabin就是以概论大小来判断素数 可以判断2^63范围的数 pollard_rho推荐两个很好的博客来理解:整数分解费马方法以及Pollard rho和[ZZ]Pollard Rho算 ...
- 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】
集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...
- poj 2429 Pollard_rho大数分解
先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小. 这里能够直接搜索,注意一个问题,因为同样因子不能分配给两边(会改变gcd)所以能够将同样因子合并,这种话,搜 ...
随机推荐
- 为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?
先看HashMap的定义: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V> ...
- pip国内镜像
[国内镜像] 中国科学技术大学 : https://pypi.mirrors.ustc.edu.cn/simple 清华:https://pypi.tuna.tsinghua.edu.cn/simpl ...
- echarts使用笔记五:echarts的Zoom控件
option = { title: { text: '趋势' }, tooltip : { trigger: 'axis', show:true, axisPointer : { // 坐标轴指示器, ...
- Linxu-chsh命令
chsh用于修改登陆后的shell,每个用户都有独立的shell. 以下是chsh命令的常用操作: 一.查看本机安装了哪些shell chsh -l 二.查看当前用户正在使用的Shell ...
- Ubuntu18.04更新源
一.备份/etc/apt/sources.list文件 cd /etc/apt sudo cp sources.list sources.list.old 二.选择国内常用的源 #阿里源 deb ht ...
- C99标准的柔性数组 (Flexible Array)
[什么是柔性数组(Fliexible Array)] 柔性数组在C99中的定义是: 6.7.2.1 Structure and union specifiers As a special case, ...
- JavaScript中的函数和C#中的匿名函数(委托、lambda表达式)
在js中function是一个一个引用类型,所以可以出现这样的代码: 'use strict'; var compare=function(value1, value2) { if (value1&l ...
- [转帖]Docker的daemon.json的作用
Docker(十六)-Docker的daemon.json的作用 https://www.cnblogs.com/zhuochong/p/10070434.html jfrog 培训的时候 说过这个地 ...
- 123. 单词搜索(DFS)
描述 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词. 单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻.每个单元中的字母最多只能使用一次. 样例 给出 ...
- VUE项目问题之:去掉url中的#/
一.问题 使用VUE路由,项目的url总是带有锚点,如下: http://localhost:8082/#/ 二.解决 修改路由文件中 index.js 文件,即 src --> router ...