每个括号里出一个X其他括号里出一个常数,设Sn=a1 * a2 * ... * an, ai 为第i个括号内的常数(x + ai), 则 ans = Sn / a1 + Sn / a2 + .. Sn / an, 主义题目要求对10007取模,取模的结果不能为负数,所以(res + MOD)%MOD,因为涉及到了除法的取模,所以不能直接Sn/ai, 而是要 Sn * (a 的逆元),采用费马小定理求逆元, 费马小定理:a^(p-2) mod p 是 a 在 mod p 下的逆元,p为质数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 10007;
string s;
ll ji = 1;
ll fun(ll a) {
ll res = 1, b = MOD - 2;
while (b) {
if (b & 1) res = (res * a) % MOD;
b >>= 1;
a = (a * a) % MOD;
}
return res;
}
int main() {
cin >> s;
vector<ll> v;
for (int i = 0; i < s.size(); i += 5) {
ll t = s[i + 3] - '0';
if (s[i + 2] == '-') t = -t;
ji = (ji * t) % MOD;
v.push_back(t);
}
long long res = 0;
for (auto t : v) {
res = (res + ji * fun(t) + MOD) % MOD;
}
cout << (res + MOD) % MOD;
return 0;
}

京公网安备 11010502036488号