BZOJ3481 DZY Loves Math III(数论+Pollard_Rho)
考虑对于每一个x有多少个合法解。得到ax+by=c形式的方程。如果gcd(x,y)|c,则a在0~y-1范围内的解的个数为gcd(x,y)。也就是说现在所要求的是Σ[gcd(x,P)|Q]*gcd(x,P)。
对这个式子套路地枚举gcd,可以得到Σdφ(P/d) (d|gcd(P,Q))。质因子间相互独立,考虑每个质因子的贡献再累乘。如果d取完了P的某项质因子,那么该质因子的贡献为piqi,否则为(pi-1)piqi-1。于是rho分解完质因数就可以算了。
注意特判Q=0。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define P 1000000007
#define ll long long
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,cntp=,cntq=,ans=;
ll p[],q[],a[],b[],c[],d[];
ll gcd(ll n,ll m){return m==?n:gcd(m,n%m);}
ll ksc(ll a,ll b,ll p)
{
ll t=a*b-(ll)((long double)a*b/p+0.5)*p;
return (t<)?t+p:t;
}
ll ksm(int a,ll k,ll p)
{
if (k==) return ;
ll tmp=ksm(a,k>>,p);tmp=ksc(tmp,tmp,p);
if (k&) return ksc(tmp,a,p);else return tmp;
}
bool check(int k,ll n)
{
if (k>=n) return ;
ll p=n-;
ll t=ksm(k,p,n);
if (t==n-) return ;
if (t!=) return ;
while (!(p&))
{
p>>=;
ll t=ksm(k,p,n);
if (t==n-) return ;
if (t!=) return ;
}
return ;
}
bool Miller_Rabin(ll n)
{
if (n==) return ;
for (int i=;i*i<=min(n,100ll);i++)
if (n%i==) return n==i;
if (n<=) return ;
else return check(,n)&&check(,n)&&check(,n)&&check(,n)&&check(,n)&&n!=;
}
ll f(ll x,ll n,int c){return (ksc(x,x,n)+c)%n;}
void Pollard_Rho(ll n,ll *a,int &cnt)
{
if (n==) return;
if (Miller_Rabin(n)) {a[++cnt]=n;return;}
if (n<=) for (int i=;i<=n;i++) if (n%i==&&Miller_Rabin(n/i)) {a[++cnt]=n/i;Pollard_Rho(i,a,cnt);return;}
while ()
{
int c=rand()%(n-)+;
ll x=(rand()%n+c)%n,y=x;
do
{
ll z=gcd(abs(x-y),n);
if (z>&&z<n) {Pollard_Rho(n/z,a,cnt),Pollard_Rho(z,a,cnt);return;}
}while ((x=f(x,n,c))!=(y=f(f(y,n,c),n,c)));
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3481.in","r",stdin);
freopen("bzoj3481.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();srand();
cntp=;for (int i=;i<=n;i++) p[i]=read(),Pollard_Rho(p[i],a,cntp);
cntq=;for (int i=;i<=n;i++) q[i]=read(),Pollard_Rho(q[i],b,cntq);
sort(a+,a+cntp+);sort(b+,b+cntq+);
for (int i=;i<=cntp;i++)
{
int t=i;
while (a[t+]==a[i]) t++;
c[i]=t-i+;i=t;
}
for (int i=;i<=cntq;i++)
{
int t=i;
while (b[t+]==b[i]) t++;
d[i]=t-i+;i=t;
}
for (int i=;i<=cntp;i++)
if (c[i]&&!c[i-])
for (int j=i-;j&&!c[j];j--) c[j]=c[j+],c[j+]=;
cntp=unique(a+,a+cntp+)-a-;
for (int i=;i<=cntq;i++)
if (d[i]&&!d[i-])
for (int j=i-;j&&!d[j];j--) d[j]=d[j+],d[j+]=;
cntq=unique(b+,b+cntq+)-b-;
for (int i=;i<=cntp;i++) a[i]%=P;
for (int i=;i<=cntq;i++) b[i]%=P;
if (b[]==)
{
cntq=cntp;
for (int i=;i<=cntp;i++) b[i]=a[i],d[i]=c[i];
}
for (int j=;j<=cntp;j++)
{
int x=;
for (int i=;i<=cntq;i++)
if (b[i]==a[j]) {x=d[i];break;}
if (x<c[j]) ans=1ll*ans*ksm(a[j],c[j]-,P)%P*(x+)%P*(a[j]-)%P;
else ans=1ll*ans*ksm(a[j],c[j]-,P)%P*(1ll*c[j]*(a[j]-)%P+a[j])%P;
}
cout<<ans<<endl;
return ;
}
BZOJ3481 DZY Loves Math III(数论+Pollard_Rho)的更多相关文章
- Bzoj3481 DZY Loves Math III
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 310 Solved: 65 Description Input Output Sample Input ...
- BZOJ3560 DZY Loves Math V 数论 快速幂
原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html UPD(2018-03-26):蒟蒻回来重新学数论了.更新了题解和代码.之前的怼到后面去了 ...
- BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演
原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...
- bzoj 3481 DZY Loves Math III——反演+rho分解质因数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3481 推推式子发现:令Q=gcd(P,Q),ans=Σ(d|Q) d*phi(P/d).把 ...
- DZY Loves Math系列
link 好久没写数学题了,再这样下去吃枣药丸啊. 找一套应该还比较有意思的数学题来做. [bzoj3309]DZY Loves Math 简单推一下. \[\sum_{i=1}^n\sum_{j=1 ...
- DZY Loves Math 系列详细题解
BZOJ 3309: DZY Loves Math I 题意 \(f(n)\) 为 \(n\) 幂指数的最大值. \[ \sum_{i = 1}^{a} \sum_{j = 1}^{b} f(\gcd ...
- 【BZOJ3561】DZY Loves Math VI (数论)
[BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...
- 【BZOJ 3561】 3561: DZY Loves Math VI (莫比乌斯,均摊log)
3561: DZY Loves Math VI Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 205 Solved: 141 Description ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...
随机推荐
- selenium无法正常运行 Chrome浏览器,cannot find Chrome binary的问题
有些同学在运行selenium-chrome时会遇到这个问题, System.setProperty("webdriver.chrome.driver","files/c ...
- 使用Fiddler模拟客户端http响应【转】
转自:使用Fiddler模拟客户端http响应 在客户端开发中,常常需要对一些特殊情况做处理,比如404.503等,又比如服务返回错误数据等.而测试这些情况会比较麻烦,往往都是找开发人员配合修改代码, ...
- Git积累
1.使用git config命令进行配置(此配置为全局配置,这些是在提交commit时的签名): $ git config --global user.name "填写github的用户名& ...
- krkr基础篇(一)
krkr基础篇是我根据krkr的官方教程总结而来 推荐代替记事本的工具:editplus,点我下载 激活码:Vovan 3AG46-JJ48E-CEACC-8E6EW-ECUAW 一:创建新工程 1: ...
- shell中中括号的使用
原文出处:https://www.jianshu.com/p/855c9fb373ff Shell 里面的方括号(包括单中括号与双中括号)可用于以下三种情况的判断: 算术比较. 比如一个变量是否为0, ...
- 1.VBA 基本概念——《Excel VBA 程序开发自学宝典》
1.1 常见对象及含义 对象名 含义 application 整个Excel应用程序 window 窗口 worksheet 一个工作表 sheets 指定工作簿的所有工作表的合集 shaperan ...
- Linux加密到K8S中
文件名字 test.conf 加密: base64 --wrap=0 aaa.conf 把得到的密钥填入配置文件当中即可
- 2015第六届蓝桥杯C/C++ B组
奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...
- spring boot+mybatis+swagger搭建
环境概述 使用的开发工具:idea 2018 3.4 环境:jdk1.8 数据库:MariaDB (10.2.21) 包管理:Maven 3.5 Web容器:Tomcat 8.0 开发机系统:Wind ...
- dos2unix命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/leedaning/article/details/53024290 使用git 的时候碰到git将unix换行符转换为wi ...