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

当时比赛时灵机一动 把 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值