[数论 反演] BZOJ 4833 最小公倍佩尔数

来源:互联网 发布:linux apache cgi 编辑:程序博客网 时间:2024/06/05 06:41

当时比赛时灵机一动 把gigi1喂给了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;}
0 0
原创粉丝点击