2021-09-21
作者:互联网
智乃酱的区间乘积( + 代码注释)
前缀积 + 费马小定理 + 快速幂
题目描述:
测试用例
/*
前缀积 + 费马小定理
1.前缀积和前缀和类似(先构建一个类乘序列,在通过乘法运算的性质求出区间积)
* 2.费马小定理:a^(p-1) = 1 (mod p)
因此,b/a = b * 1/a = b * (a^(p-1) % P) = b * (a^(p-2) % p)
从而将两个大数相除,转化为两个大数相乘;(a^(p-2) % p)可以使用快速幂求解
*/
#include<iostream>
using namespace std;
#define N 1000000007
// 前缀积序列
long long sum[100010] = {1}; // 求前缀积时,要把第一个数置为 1
// 快速幂
long long quick_mi(long long a,long long b,long long k)
{
long long res = 1;
while(b)
{
if(b & 1) res = a * res % k;
b >>= 1;
a = a * a % k;
}
return res;
}
int main()
{
int n,m;
long long t,k,p;
cin >> n >> m;
for(int i = 1;i <= n;i++) cin >> t,sum[i] = (sum[i-1] * t) % N;
while(m--)
{
int l,r;
cin >> l >> r;
// 两数相乘的结果需要 % (10^9+7)
cout << (sum[r] * quick_mi(sum[l-1],N-2,N)) %N << endl;
}
return 0;
}
标签:前缀,int,res,sum,09,long,2021,费马,21 来源: https://blog.csdn.net/YANGJIERUN/article/details/120400084