这道题其实挺简单的,就是求1~n关于模p的逆元,仔细想一下求逆元的方法
1.快速幂(我第一个想到的方法)
但是会TLE,想了一下快速幂的时间复杂度为O(logn),再加上输入数据还要O(n),所以时间复杂度为O(nlogn),那么这都会超时只能把时间复杂度优化到O(n)了,那么就是线性递推求逆元了。
2.线性递推求逆元
推导公式过程我就不写了,网上太多了,我本就是为了记录一下,懒得写这么多了。
主要就是想记录一下发现cout和printf的时间有差距,下面看代码。
TLE
#include <iostream>
typedef long long ll;
using namespace std;
const int N=3e6+5;
ll inv[N];
int main() {
int n,p;
inv[0]=0;
inv[1]=1;
cin>>n>>p;
cout<<inv[1]<<endl;
for(int i=2;i<=n;i++)
{
inv[i]=(ll)p-(p/i)*inv[p%i]%p;
cout<<inv[i]<<endl;
}
return 0;
}
AC
#include <iostream>
#include<cstdio>
typedef long long ll;
using namespace std;
const int N=3e6+5;
ll inv[N];
int main() {
int n,p;
inv[0]=0;
inv[1]=1;
scanf("%d%d",&n,&p);
printf("1\n");
for(int i=2;i<=n;i++)
{
inv[i]=(ll)p-(p/i)*inv[p%i]%p;
printf("%d\n",inv[i]);
}
return 0;
}
就因为cout,始终超时,我当时一直找不到原因,疯狂提交, 最后迫不得已把cout改成了printf,结果过了,我马上就开始搜索cout和printf的区别,大致明白cout因为是靠<<把数据流输出到屏幕上,所以时间上会比printf慢很多。下次再碰到大数,直接上printf。