Bzoj3481 DZY Loves Math III
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 310 Solved: 65
Description
Input
Output
Sample Input
1
2
3
2
4
2
Sample Output
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的更多相关文章
- 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 ...
- 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 ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...
- 【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) ...
- [BZOJ3561] DZY Loves Math VI
(14.10.28改) 本来只想写BZOJ3739:DZY Loves Math VIII的,不过因为和VI有关系,而且也没别人写过VI的题解,那么写下. 不过我还不会插公式…… http://www ...
- 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较小 ...
- ●BZOJ 3309 DZY Loves Math
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...
随机推荐
- 用纯css改变下拉列表select框的默认样式(转)
用纯css改变下拉列表select框的默认样式 分享到 分类 JS学习 关键字 前端 发布 kris 2015-04-01 注意 转载须保留原文链接,译文链接,作者译者等信息. 在这 ...
- Python中对变量是否为None的判断
三种主要的写法有: 第一种:if X is None; 第二种:if not X: 当X为None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这 ...
- YaoLingJump开发者日志(七)
LGame用起来真是各种蛋疼,插背景都可以显示不出来.在屏幕结束后释放资源,重载该屏幕时再setbackground也不行,直接用Lpaper当background更不行,会把tilemap上的东 ...
- 【Linux】- rm命令
Linux rm命令用于删除一个文件或者目录. 语法 rm [options] name... 参数: -i 删除前逐一询问确认. -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认. -r 将目 ...
- 网络控制API 路由表 arp表 包括tcp的这些参数都是从哪里设置
路由表查看 arp缓存 都是走的什么接口?
- Java设计
重构前 CustomDataChar | getConnection()findCustomers()createChar()displayChar() 重构后 CustomDataChar | da ...
- 2011 Multi-University Training Contest 6 - Host by JLU
打了4hours,做出一道题...太菜了.rank:45/107 开场看B,题目看不懂...3hours半才发现i<=N-1,不是i<=x-1.然而还是不会. 看到J有人过了,发现是个简单 ...
- BZOJ 1227 虔诚的墓主人(离散化+树状数组)
题目中矩形的尺寸太大,导致墓地的数目太多,如果我们统计每一个墓地的虔诚度,超时是一定的. 而常青树的数目<=1e5.这启发我们从树的方向去思考. 考虑一行没有树的情况,显然这一行的墓地的虔诚度之 ...
- BZOJ4736 温暖会指引我们前行(LCT+最大生成树)
类似于瓶颈路,满足条件的路径一定在温度的最大生成树上,那么就是一个LCT维护MST的裸题了. #include<iostream> #include<cstdio> #incl ...
- libsvm 用在 婚介数据集中 预测 用户配对
分类前具备的数据集: 书本第九章数据集(训练集):agesonly.csv和matchmaker.csv. agesonly.csv 格式是: 男年龄,女年龄,是否匹配成功 24,30,1 30,4 ...