码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ3560 DZY Loves Math V 数论 快速幂

时间:2017-12-26 00:52:54      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:struct   alc   sort   end   bsp   names   span   node   href   

原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html


题目传送门 - BZOJ3560


题意概括

给定n个正整数a1,a2,…,an,求

  技术分享图片

的值(答案模10^9+7)。

1<=n<=10^5,1<=ai<=10^7。


题解

  本人是蒟蒻。

  可以看这位大佬的(给出链接)

http://blog.csdn.net/popoqqq/article/details/42739963


代码

呵呵,调试的时候照着他的改,改的几乎一样……

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const LL N=100005;
LL mod=1e9+7;
LL n,tot=0;
struct Node{
	LL p,t;
}q[N*20];
bool operator < (Node a,Node b){
	return a.p<b.p;
}
void fj(LL v){
	for (LL i=2;i*i<=v;i++)
		if (v%i==0){
			q[++tot].p=i;
			q[tot].t=0;
			while (v%i==0)
				v/=i,q[tot].t++;
		}
	if (v>1)
		q[++tot].p=v,q[tot].t=1;
}
LL Pow(LL x,LL y,LL mod){
	if (y==0)
		return 1LL;
	LL xx=Pow(x,y/2,mod);
	xx=xx*xx%mod;
	if (y&1LL)
		xx=xx*x%mod;
	return xx;
}
LL Inv(LL x,LL mod){
	return Pow(x,mod-2,mod);
}
LL calc(LL L,LL R){
	LL sum[30];
	LL p=q[L].p,res=1;
	sum[0]=1;
	for (int i=1;i<30;i++)
		sum[i]=(sum[i-1]*p+1)%mod;
	for (int i=L;i<=R;i++)
		res=res*sum[q[i].t]%mod;
	res=(res-1)*(p-1)%mod*Inv(p,mod)%mod+1;
	return res%mod;
}
int main(){
	scanf("%lld",&n);
	for (int i=1,a;i<=n;i++){
		scanf("%lld",&a);
		fj(a);
	}
	sort(q+1,q+tot+1);
	int last=0;
	LL ans=1;
	for (int i=1;i<=tot;i++)
		if (i==tot||q[i].p!=q[i+1].p)
			ans=ans*calc(last+1,i)%mod,last=i;
	printf("%lld",(ans%mod+mod)%mod);
	return 0;
}

  

 

BZOJ3560 DZY Loves Math V 数论 快速幂

标签:struct   alc   sort   end   bsp   names   span   node   href   

原文地址:https://www.cnblogs.com/zhouzhendong/p/8111725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!