Acdream a + b

本文介绍了一种处理大数运算中模幂算法的具体实现方法。通过使用自定义的模乘(fMul)和模幂(modExp)函数,解决了两个long long型数据相乘超出类型范围的问题,并给出了一段C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acdream.info/problem?pid=1007

两个 long long 相乘会超long long

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define ll long long
 5 #define maxn 10000
 6 #define mod 10000000007
 7 using namespace std;
 8 
 9 ll a[maxn];
10 ll n,k,t;
11 ll fMul(ll a, ll b) {
12     ll t = 0, y = a;
13     while(b) {
14         if(b & 1) t = (t + y) % mod;
15         y = (y + y) % mod;
16         b >>= 1;
17     }
18     return t;
19 }
20 
21 ll modExp(ll a, ll b) {
22     ll t = 1, y = a;
23     while(b) {
24         if(b & 1) t = (fMul(t, y)) % mod;
25         y = (fMul(y, y)) % mod;
26         b >>= 1;
27     }
28     return t;
29 }
30 
31 int main()
32 {
33       scanf("%lld",&t);
34       while(t--)
35       {
36           scanf("%lld%lld",&n,&k);
37           ll sum=0;
38           for(int i=0; i<n; i++)
39           {
40               scanf("%lld",&a[i]);
41           }
42           for(int i=0; i<n; i++)
43           {
44               a[i]=((a[i]%mod)+mod)%mod;
45               ll c=modExp(a[i],k);
46               sum=(sum+c)%mod;
47           }
48           printf("%lld\n",sum);
49       }
50       return 0;
51 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/4011947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值