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 ...
随机推荐
- 【Python学习笔记之三】lambda表达式用法小结
除了def语句之外,Python还提供了一种生成函数对象的表达式形式.由于它与LISP语言中的一个工具很相似,所以称为lambda.就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了 ...
- java学习(五)Number类、Math类
Number类 顾名思义嘛,搞数字的,以前也用到过,就是相当于内置了一堆数字的类嘛,用哪种类型的就引用下这个包就好了呗 Integer.Long.Byte.Double.Float.Short都是Nu ...
- win10系统安装docker注意事项
首先要确保win10系统支持 hyper-v 技术. 然后按照官网的流程下载,安装,基本上不会出什么问题.安装好之后使用,需要进行以下几个操作 access denied问题的解决 按win+R,输入 ...
- 通过扩展方法简化UnityAPI调用
通过扩展方法简化UnityAPI调用 扩展方法unity apiapi简化 通过扩展方法简化UnityAPI调用 能省一秒是一秒,时间就是金钱,没人愿意把时间花在冗长的coding上
- VM虚拟机系统时间同步网络时间并登录用户自动校正时间
原文出处: http://blog.51cto.com/wutou/1932317 VM虚拟机大家都用,我在用完后,经常使用"挂起客户机",但是这样一来,系统恢复启动很快,但是少了 ...
- 如何配置php客户端(phpredis)并连接Redis--华为DCS for Redis使用经验系列
使用php连接Redis.Memcache等都需要进行扩展,以CentOS为例,介绍phpredis的客户端环境搭建. 第0步:准备工作 华为云上购买1台弹性云服务器ECS(我选了CentOS 6.3 ...
- Overlay 网络
- time命令详情
基础命令学习目录首页 原文链接:https://blog.csdn.net/adaptiver/article/details/6596143?utm_source=blogxgwz3 linux下t ...
- 升级Xcode 10 后报错问题记录([CP] Copy Pods Resources)
1.升级Xcode到Version 10.0 (10A255)后,运行已有项目,报如下错误: error: Multiple commands produce '/Users/galahad/Libr ...
- Linux安装软件包
今天在坐公交的路上看到一遍文章感觉还不错,先收集了.原文链接 Linux安装软件包