20240705-牛客练习赛127-B

登录—专业IT笔试面试备考平台_牛客网

题目描述
对于一个正整数 n 和一个非负整数 d,定义 f{_{d}}(n)为 n的所有约数的 d 次方之和。如 f{_{3}}(10)=1^{3}+2^{3}+5^{3}+10^{3}

现给定 n,d求f{_{d}}(n) 的值。由于答案可能很大,输出答案对 10^{9}+7 取模的结果。

输入描述

由于n可能很大,所以给出n的质因数分解时式

n=\prod_{i=1}^{w}p_{i}^{a_{i}}

第一行输入一个正整数w和一个非负整数d

接下来w行,每一行输入两个正整数p_{i} ,a_{i}

保证p_{i}都是素数且互不相同

对于全部测试点,保证1\leq w\leq10^{5},0\leq d \leq 10^{9},2\leq p_{i} \leq 10^{9},1\leq a_{i} \leq 10^{9}

这里有前缀和的思想:

假设一个数字可以分解质因数为:2^{3}*3^{2}*5^{2}

设所求的和为ans。那么首先我们先把1加上,这个1可以记作第一个因数(这里是2)的零次幂。

对于因数2,可以选1或2个2相乘,则ans+=2^{1}+2^{2}+2^{3}(这里取模省略,下同)

对于因数3,可以选1个和1搭配,或者选1个和2^{1}搭配,或选1个和2^{2}搭配......,也可以选2个3和1搭配,两个3和2^{1}搭配......

这样下来,ans要加的就是3^{1}+(3^{1}*2^{1}+3^{1}*2^{2}+3^{1}*2^{3} )+(3^{2}*2^{1}+3^{2}*2^{2}+3^{2}*2^{3})

把这个记为A式。

当再进一个5时,他的选择是

5*[1+3^{1}+(3^{1}*2^{1}+3^{1}*2^{2}+3^{1}*2^{3} )+(3^{2}*2^{1}+3^{2}*2^{2}+3^{2}*2^{3})]

可以发现是5*A式

再进一个5,就是再加(5^{2})*[1+3^{1}+(3^{1}*2^{1}+3^{1}*2^{2}+3^{1}*2^{3} )+(3^{2}*2^{1}+3^{2}*2^{2}+3^{2}*2^{3})]

发现没有,对于5的一次或二次的选择(记为(5^{1}+5^{2})),最终使得ans加上了选5新加的乘上选5之前的ans。

所以可以利用前缀和思想,进一个系数就让原来的ans加上这个因数乘ans即可。

但是!!!

不过输入量巨大,也就意味着需要把一个因数10^{9}量级的乘法优化掉。

没错,相信你已经看出来了,等比数列求和。

要注意题目中d是可以等于0的,这就意味还要用到公比是1的特殊公式。

最后a/b对p取模用逆元就好了

代码附在下方:

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll pp=1000000007;
ll quickmod(ll ans,ll x){
	ll a=1;
	while(x){
		if(x%2){
			a=(ans%pp*a%pp)%pp;
		}
		ans=(ans%pp*ans%pp)%pp;
		x/=2;
	}
	return a;
}
int main(){
	int w=0;scanf("%d",&w);
	ll d=0;scanf("%lld",&d);
	ll ans=1;
	for(int i=1;i<=w;i++){
		ll p,a;
		scanf("%lld %lld",&p,&a);
		ll dd=quickmod(p,d);
		ll up=dd*quickmod(dd,a)-dd;
		if(d==0){
			up=(dd%pp*a%pp)%pp;
		}
		ll down=quickmod(dd-1,pp-2);
		ll temp=(up%pp*down%pp)%pp;
		if(d==0){
			ans=((ans%pp)+(ans%pp)*(a%pp))%pp;
		}else{
			ans=((ans%pp)+(ans%pp)*(temp%pp)%pp)%pp;
		}
	}
	printf("%lld",ans);
	return 0;
}

 谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值