选拔赛-数论-逆元

来源:互联网 发布:怎样成为淘宝摄影师 编辑:程序博客网 时间:2024/05/04 08:51

id=97


xyz(mod p),zk
x \equiv z * y ^ {-1} (mod \ p), z \leqslant kxzy1(mod p),zk
因此算出yypp下的逆元,枚举zz就可以求出xx
时间复杂度O(k)O(k)


#include <bits/stdc++.h>using namespace std;#define N 100020#define M 200200#define LL long long#define mod 1000000007#define inf 0x3f3f3f3f#define pll pair<LL, LL>#define fi first#define se second#define MP make_pair#define PB push_back#define pii pair<int, int>#define ls (i << 1)#define rs (ls | 1)#define md ((ll + rr) >> 1)#define lson ll, md, ls#define rson md + 1, rr, rsint y, k, p;int qpow(int x, int k) {int ret = 1;while(k) {if(k & 1) ret = 1LL * ret * x % p;k >>= 1;x = 1LL * x * x % p;}return ret;}int pri[N], np[N], cnt;void init() {//for(int i = 2; i < N; ++i) {if(!np[i]) {pri[cnt++] = i;}for(int j = 0; j < cnt && i * pri[j] < N; ++j) {np[i * pri[j]] = 1;if(i % pri[j] == 0) break;}}}int main() {int cas;scanf("%d", &cas);while(cas--) {scanf("%d%d%d", &y, &k, &p);LL ans = 0;if(y == 0) ans = 1LL * p * (p - 1) / 2;else {y = qpow(y, p - 2);//这里的y变了,变成原来y的逆元for(int i = 1; i <= k; ++i) {ans += 1LL * y * i % p;//i是这里的z,}}printf("%lld\n", ans);}return 0;}


0 0
原创粉丝点击