代码:
/*
let p = k * i + r
k * i + r ≡ 0 (mod p)
multiply both sides by inv[i] and inv[r]:
k * inv[r] + inv[i] ≡ 0 (mod p)
inv[i] = - k * inv[r] (mod p)
k = floor(p / i), r = p % i
so, inv[i] = (- floor(p / i) * inv[p % i] + p) % p
*/
#include <bits/stdc++.h>
#define int long long
int n, p;
int inv[20000529] = {0, 1};
int read(){
int x = 0, f = 1; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) f ^= (ch == '-');
for(; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch xor 48);
return f? x : -x;
}
void write(int x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 xor 48);
}
signed main(){
n = read(), p = read();
write(inv[1]); putchar('\n');
for(int i = 2; i <= n; ++i){
inv[i] = (- (p / i) * inv[p % i] + (p << 2)) % p;
write(inv[i]), putchar('\n');
}
return 0;
}
C++14 O2:
g++: 编译器内部错误:File size limit exceeded signal terminated program as
请提交一份完整的错误报告,
如有可能请附上经预处理后的源文件。
参阅 <https://gcc.gnu.org/bugs/> 以获取指示。
C++20 O2:
g++: 编译器内部错误:File size limit exceeded signal terminated program as
Please submit a full bug report, with preprocessed source (by using -freport-bug).
参阅 <https://gcc.gnu.org/bugs/> 以获取指示。