当时比赛时灵机一动 把
gigi−1
喂给了OEIS
然后就找到了 233 就是这个咯
然后就水过去了
题解?题解我还没看 先挖个坑
UPD:跟这个题是一毛一样的咯
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1000005;
int P;
inline ll Pow(ll a,int b){
ll ret=1;
for (;b;b>>=1,a=a*a%P)
if (b&1)
ret=ret*a%P;
return ret;
}
int n;
ll f[N],g[N];
#define read(x) scanf("%d",&(x))
int main(){
int Q;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(Q);
while (Q--){
read(n); read(P);
f[0]=0; f[1]=g[1]=1;
for (int i=2;i<=n;i++) f[i]=((f[i-1]<<1)%P+f[i-2])%P,g[i]=f[i];
for (int i=1;i<=n;i++){
ll inv=Pow(g[i],P-2);
for (int j=i+i;j<=n;j+=i)
g[j]=g[j]*inv%P;
}
ll lcm=1,ans=0;
for (int i=1;i<=n;i++)
lcm=lcm*g[i]%P,ans+=lcm*i%P;
printf("%lld\n",ans%P);
}
return 0;
}