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 ...
随机推荐
- C++构造函数和析构函数什么情况下会用
析构函数: 1. 对象生命周期结束,被销毁时: 2. delete 指向对象的指针时: 3. delete 指向基类对象的指针时,其析构函数是虚函数: 4. 在嵌套关系中,对象A是对象B的成员,当对象 ...
- 详解YUV420数据格式
原文地址:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html 1. YUV简介 YUV定义:分为三个分量,“Y”表示明亮度( ...
- PHPCMS 栏目添加字段和修改描述textarea变成fceditor编辑器
一.添加字段方法: 1. 添加数据库字段:description1,添加位置:v9_catetory表 找到phpcms/moudles/admin/templates/category_add.tp ...
- 别再犯低级错误,带你了解更新缓存的四种Desigh Pattern
在我们使用分布式缓存Redis或者Memcached编写更新缓存数据代码时,我们总是会犯一个逻辑错误.先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中.试想,两个并发操作,一个是更新操 ...
- 搬运_maven打包
参考文章 利用Maven插件将依赖包.jar/war包及配置文件输出到指定目录 <build> <plugins> <plugin> <groupId> ...
- 第十二周PSP
- Java里字符串split方法
Java中的split方法以"."切割字符串时,需要转义 String str[] = s.split("\\.");
- 使用Spring boot 嵌入的tomcat不能启动: Unregistering JMX-exposed beans on shutdown
新建一个spring boot的web项目,运行之后控制台输出“Unregistering JMX-exposed beans on shutdown”,tomcat也没有运行.寻找原因,看了下pom ...
- Alpha版本BUG BASH
在本次软件开发的第一轮迭代中,我们团队遇到了很多问题.首先是和学长联系不上导致拿到项目前一版本的代码的时间延后了一个星期. 拿到代码后发现由于安装环境的问题代码无法移植.在这一阶段我们就耗费了大量的时 ...
- 第一次作业——MathExam285
MathExam285 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 • Estimate ...