笔记 费马小定理

(a/b)%mod=a*pow(b,mod-2);
例题:给定一个数组,多次问询,求区间乘积取余

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
long long a[N], b[N], f[N];
long long ans;
long long mod = 1e9 + 7;
int n, m;


long long qmi(long long x, long long y) {
    
    
	long long ans = 1;
	long long base = x;
	while (y) {
    
    
		if (y & 1)
			ans = ans * base % mod;
		y >>= 1;
		base = base * base % mod;
	}
	return ans;
}

int main() {
    
    
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	b[0] = 1;
	f[0]=1;
	for (int i = 1; i <= n; i++) {
    
    
		b[i] = b[i - 1] * a[i] % mod;
		f[i] = qmi(b[i], mod - 2);
	}
	while (m--) {
    
    
		long long l, r;
		cin >> l >> r;
		cout << b[r] * f[l - 1] %mod<< endl;
	}
}

Guess you like

Origin blog.csdn.net/fdxgcw/article/details/119775132