求调费马小定理求逆元,自认为都取模了,求开了int128,WA10pts,悬关
查看原帖
求调费马小定理求逆元,自认为都取模了,求开了int128,WA10pts,悬关
749175
114514xxx楼主2024/10/16 13:32
#include<bits/stdc++.h>
#define int __int128
using namespace std;
const int N=4e5+105;
const int mod=1e9+7;
struct node{
    int l,r;
    int ssum,sum;
}t[N];
inline int read(){
    int x=0,f=1;
    char c=getchar_unlocked();
    while(!isdigit(c)){
        if(c=='-')f*=-1;
        c=getchar_unlocked();
    }
    while(isdigit(c)){
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar_unlocked();
    }
    return x*f;
}
inline void write(int x){
    if(x<0)putchar('-'),x*=-1;
    if(x<10)putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
int n,m;
int a[N];
int ls(int p){return 2*p;}
int rs(int p){return ls(p)+1;}
int gcd(int a,int b){
    return __gcd(a,b);
}
int power(int a,int b) {
    int ans=1;
    while(b){
        if (b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
void build(int l,int r,int p){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].ssum=a[l]*a[l];
        t[p].sum=a[l];
        t[p].sum%=mod;
        t[p].ssum%=mod;
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,ls(p));
    build(mid+1,r,rs(p));
    t[p].ssum=t[ls(p)].ssum+t[rs(p)].ssum;
    t[p].sum=t[ls(p)].sum+t[rs(p)].sum;
    t[p].sum%=mod;
    t[p].ssum%=mod;
}
void change(int x,int p,int k){
     if(t[p].l==x&&t[p].r==x){
        t[p].ssum=k*k;
        t[p].sum=k;
        t[p].sum%=mod;
        t[p].ssum%=mod;
        return;
    }
    int mid=(t[p].l+t[p].r)/2;
    if(x<=mid)change(x,ls(p),k);
    else change(x,rs(p),k);
    t[p].ssum=t[ls(p)].ssum+t[rs(p)].ssum;
    t[p].sum=t[ls(p)].sum+t[rs(p)].sum;
    t[p].sum%=mod;
    t[p].ssum%=mod;
}
int query1(int l,int r,int p){
    int ans=0;
    if(t[p].l>=l&&t[p].r<=r)
        return t[p].ssum%mod;
    int mid=(t[p].l+t[p].r)/2;
    if(l<=mid)ans+=query1(l,r,ls(p)),ans%=mod;
    if(r>mid)ans+=query1(l,r,rs(p)),ans%=mod;
    return ans%mod;
}
int query2(int l,int r,int p){
    int ans=0;
    if(t[p].l>=l&&t[p].r<=r)
        return t[p].sum%mod;
    int mid=(t[p].l+t[p].r)/2;
    if(l<=mid)ans+=query2(l,r,ls(p)),ans%=mod;
    if(r>mid)ans+=query2(l,r,rs(p)),ans%=mod;
    return ans%mod;
}
signed main(){
    cout.tie(0);
    n=read(),m=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    for(int i=1;i<=n;i++)
        a[i]%=mod;
    int opt,x,y;
    int k;
    build(1,n,1);
    for(int i=1;i<=m;i++){
        opt=read(),x=read(),y=read();
        if(opt==1)change(x,1,y);
        else {
            int p1=query1(x,y,1)%mod,q1=(y-x+1)%mod;
            int p2=query2(x,y,1)%mod;
            int sum=(((p1%mod)*(q1%mod))-((p2%mod)*(p2%mod)))%mod;
            q1*=q1;
            q1%=mod;
            int k=gcd(sum,q1)%mod;
            sum/=k,q1/=k;
            int inv=power(q1,mod-2);
            sum%=mod,inv%=mod;
            write(((sum%mod)*(inv%mod))%mod),cout<<endl;
        }
    }
}

2024/10/16 13:32
加载中...