Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 310  Solved: 65

Description

Input

Output

Sample Input

3
1
2
3
2
4
2

Sample Output

6

HINT

1<=N<=10,0<=Qi<=10^18,1<=Pi<=10^18,P>=2

本题仅四组数据。

Source

数学问题 欧拉函数 Miller-Rabin Pollard-rho

花了一整晚来怼这道题……在long long的领域遇到了许多问题。

假设我们有充足的时间枚举每一个x,那么在x确定的情况下,原式变成了一个模方程。
根据裴蜀定理,我们知道只有当$ gcd(x,P)|Q $ 的情况下方程有 $ gcd(x,P) $ 个解。
现在我们可以愉快地枚举每一个gcd,那么答案就是:
$$ans=\sum_{d|P,d|Q} d * \sum_{x}[gcd(x,\frac{P}{d})==1]$$
后面那个sum显然是欧拉函数
那么$$ ans=\sum_{d|P,d|Q} d · \varphi(\frac{P}{d}) $$
分(an)析(zhao)一(tao)波(lu),发现这是一个积性函数,所以我们可以分别考虑每个质因子的贡献,再把它们累乘起来。
我们现在考虑一个质因子p,它在P中有$q$个,在Q中有$q'$个:
它对答案的贡献是
$$ \sum_{i=0}^{q'} p^i * \varphi(p^{q-i})$$
我们知道
$$\varphi(p^{q})=p^{q}·\frac{p-1}{p}$$
所以上面的sum可以化成:
$$p^{q-1}·(p-1)·(q'+1)$$
但是有一个特殊情况,当i=q的时候,$\varphi(1)=1$,不能表示成$\frac{p-1}{p}$的形式,而我们却把它用这种形式算进去了。
也就是说我们把一个$p^q$ 的贡献算成了 $(p-1)p^{q-1}$,特判一下消除即可。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
using namespace std;
const int mxn=;
LL read(){
LL x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
return x*f;
}
LL Rand(LL n){return (((LL)rand()<<)|rand())%(n-)+;}
//
map<LL,int>primap;
LL pri[mxn*];int cnt=;
bool vis[mxn];
void init(){
int mxn=;
for(int i=;i<mxn;i++){
if(!vis[i]){
pri[++cnt]=i;
primap[i]=cnt;
}
for(int j=;j<=cnt && pri[j]*i<mxn;j++){
vis[pri[j]*i]=;
if(i%pri[j]==)break;
}
}
return;
}
//
LL mul(LL x,LL k,LL P)
{
LL res=;
while(k){
if(k&)res=(res+x)%P;
x=(x+x)%P;
k>>=;
}
return res;
}
/*
LL mul(LL a,LL b,LL P){
LL d=(long double)a/P*b+1e-8; a=a*b-d*P;
a=(a<0)?a+P:a;
printf("%lld \n",a);
return a;
}*/
LL ksm(LL a,LL k,LL P){
LL res=;
while(k){
if(k&)res=mul(res,a,P);
a=mul(a,a,P);
k>>=;
}
return res;
}
///
bool check(LL a,LL n,LL r,LL s){
LL res=ksm(a,r,n);LL b=res;
for(int i=;i<=s;i++){
res=mul(res,res,n);
if(res== && b!= && b!=n-)return ;
b=res;
}
return (res!=);
}
bool MR(LL n){//素数测试
if(n<=)return ;
if(n==)return ;
if(~n&)return ;
LL r=n-,s=;
while(!(r&))r>>=,s++;
for(int i=;i<=;i++)
if(check(Rand(n),n,r,s))return ;
return ;
}
///
LL p[mxn],q[mxn];
void addpri_P(LL x){
if(primap.count(x)){
++p[primap[x]];return;
}
pri[++cnt]=x;
primap[x]=cnt;
p[cnt]=;
return;
}
void addpri_Q(LL x){
if(primap.count(x)){
int t=primap[x];
if(q[t]<p[t])++q[t];
}
return;
}
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL Rho(LL n,LL c){
if(n<)while();
LL k=,x=Rand(n),y=x,p=;
for(LL i=;p==;i++){
x=(mul(x,x,n)+c)%n;
p=(y>x)?(y-x):(x-y);
p=gcd(n,p);
if(i==k)y=x,k<<=;
}
return p;
}
void solve(LL x,bool flag){//分解质因数
if(x==)return;
if(MR(x)){
if(!flag)addpri_P(x);//P
else addpri_Q(x);//Q
return;
}
LL t=x;
while(t==x)t=Rho(x,Rand(x));
solve(t,flag);
solve(x/t,flag);
return;
}
//
const int mod=1e9+;
int n;
LL P[],Q[];
void Calc(){
LL ans=;
for(int i=;i<=cnt;i++){
if(!p[i])continue;
LL R=mul((q[i]+),(pri[i]-),mod);
if(p[i]==q[i])R++;
R=mul(R,ksm(pri[i],p[i]-,mod),mod);
ans=mul(ans,R,mod);
}
printf("%lld\n",ans);
return;
}
int main(){
srand();
init();
int i,j;
n=read();
for(i=;i<=n;i++){
P[i]=read();
solve(P[i],);
}
for(i=;i<=n;i++){
Q[i]=read();
if(!Q[i]){//特判0
for(j=;j<=cnt;j++)q[j]=p[j];
break;
}
else solve(Q[i],);
}
Calc();
return ;
}

Bzoj3481 DZY Loves Math III的更多相关文章

  1. 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 ...

  2. 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).把 ...

  3. DZY Loves Math系列

    link 好久没写数学题了,再这样下去吃枣药丸啊. 找一套应该还比较有意思的数学题来做. [bzoj3309]DZY Loves Math 简单推一下. \[\sum_{i=1}^n\sum_{j=1 ...

  4. DZY Loves Math 系列详细题解

    BZOJ 3309: DZY Loves Math I 题意 \(f(n)\) 为 \(n\) 幂指数的最大值. \[ \sum_{i = 1}^{a} \sum_{j = 1}^{b} f(\gcd ...

  5. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  6. 【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

    3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...

  7. [BZOJ3561] DZY Loves Math VI

    (14.10.28改) 本来只想写BZOJ3739:DZY Loves Math VIII的,不过因为和VI有关系,而且也没别人写过VI的题解,那么写下. 不过我还不会插公式…… http://www ...

  8. BZOJ 3512: DZY Loves Math IV [杜教筛]

    3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...

  9. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

随机推荐

  1. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  2. JSON解析与序列化

    JSON之所以流行,拥有与JavaScript类似的语法并不是全部原因.更重要的一个原因是,可以把JSON数据结构解析为有用的 JavaScript对象.与XML数据结构要解析成DOM文档而且从中提取 ...

  3. android入门 — ListView

    ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎.今日头条.微博.通讯录等. ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中 ...

  4. iOS- iOS 7 的后台多任务 (Multitasking) 对比之前的异同、具体机制、变化

    简单来说,这玩意是对开发者友好,但对设备不友好的(可能会偷偷摸摸地占用流量和电量).对用户来说,如果你带宽够,对发热不敏感的话,会得到更好的应用体验. 从 iOS 4 开始,应用就可以在退到后台后,继 ...

  5. TCP系列31—窗口管理&流控—5、TCP流控与滑窗

    一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...

  6. Ubuntu安装配置JDK、Tomcat、SVN服务器

    一.配置jdk 1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 注:笔者是直 ...

  7. c++内存分类

    1. 代码段:放置代码 2. 静态数据段:放置全局变量和static的局部变量,字符串常量 3. 动态数据段:栈,放置局部作用域的变量,离开函数返回后就会被释放:堆,必须手动的分配和释放. 关于字符串 ...

  8. svn checkout不包括根目录

    在后面加 “.” 即可,如下: svn co svn://127.0.0.1/ylshop/ . 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/

  9. WPF文件和文件夹的操作

    1.对文件的操作 private void button_chose_Click(object sender, RoutedEventArgs e) { var openFileDialog = ne ...

  10. 【EF】Entity Framework 6新特性:全局性地自定义Code First约定

    应用场景 场景一:EF Code First默认使用类名作为表名,如果我们需要给表名加个前缀,例如将类名Category映射到表Shop_Category.将Product映射到Shop_Produc ...