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 ...
随机推荐
- 封装的一套简单轻量级JS 类库(RapidDevelopmentFramework.JS)
1.最近好久没有更新自己的博客了,一直在考虑自己应该写一些什么.4.2日从苏州回到南京的路上感觉自己的内心些崩溃和失落,我就不多说了? 猛然之间我认为自己需要找一下内心的平衡.决定开发属于自己一套快速 ...
- Macaca环境搭建全教程
首先想要会Macaca,还得先会用github,不然你得死……因为各种例子都在git上,官网也一样,蛋疼的很…… #基础环境 1.JDK:jdk1.8-配置变量 2.Android SDK:sdk ...
- RabbitMQ入门:主题路由器(Topic Exchange)
上一篇博文中,我们使用direct exchange 代替了fanout exchange,这次我们来看下topic exchange. 一.Topic Exchange介绍 topic exchan ...
- mysql 伪列
select @rownum:=@rownum+1 AS rownum,b.* from (SELECT @rownum:=0) r ,goods_description_new b
- mongodb基本使用(四)
MongoDB 条件操作符 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. MongoDB中条件操作符有: (>) 大于 - $gt (<) 小于 - $lt (&g ...
- Scrum Meeting 11.07
成员 今日任务 明日计划 用时 徐越 赵庶宏 薄霖 卞忠昊 JOSN数据解析 WebView和JavaScript交互基础 3h 武鑫 设计界面:独立完成一些简 ...
- CS小分队第二阶段冲刺站立会议(5月31日)
昨日成果:查找相关C#资料,清楚一些bug 遇到问题:系统获取的图标分辨率太低,网上找来的获取图标的代码看不太懂 今日计划:完善获取文件图标功能,并且能够删除获取的图标文件
- 软件共享平台的NABCD
Need: 我感觉我们这个软件很适合现在的大学生,特别是大一大二的学生,由于在大学里面学生都在各忙各的,学生遇到问题如果自己在网上查找,这就需要花费大量的时间,如果有了这个软件学生和老师都可以在这个平 ...
- EditorUtility类的说明
SetDirty这个函数告诉引擎,相关对象所属的Prefab已经发生更改. IsPersistent用于判定对象是否是被保存在硬盘中 DisplayDialog显示一个对话框,有OK,Cancel按钮 ...
- Arduino Leonardo读取DHT22温湿度传感器
首先在该地址下载库:https://codeload.github.com/nethoncho/Arduino-DHT22/zip/master 使用以下代码测试: /**************** ...