446 C. DZY Loves Fibonacci Numbers

/*
 感叹自己的代码能力实在是很差.
 非常不错的题目
 给定一列数,定义操作: 从一段数从头开始逐次加上f1,f2,f3,...,f(r-l+1).
 利用线段树解决.
 首先将连续的Fibonacci数通项公式转化为离散化的,利用二次剩余以及乘法逆元.
 那么,对于一个区间的加和操作可以理解为对一个区间几何级数系数的维护.
 这个可以利用线段树轻松解决.
 */
#include <cstdio>
#include <cstring>
#include <cmath>
#define LL long long

const int maxn = 300000 + 100;
const LL inv = 276601605;
const LL q1 = 691504013;
const LL q2 = 308495997;
const LL MOD = 1e9 + 9;

LL sum[maxn<<2];
LL p1[maxn<<2];
LL p2[maxn<<2];
LL pw1[maxn],pw2[maxn];
LL f1[maxn],f2[maxn];
LL a[maxn];
int tl,tr;

void init()
{
    pw1[0]=1,pw2[0]=1;
    for(int i=1;i<=300000+100;i++)
    {
        pw1[i]=(pw1[i-1]*q1)%MOD;
        pw2[i]=(pw2[i-1]*q2)%MOD;
    }
    f1[1]=1,f2[1]=1;
    for(int i=2;i<=300000+100;i++)
    {
        f1[i]=(f1[i-1]+pw1[i-1])%MOD;
        f2[i]=(f2[i-1]+pw2[i-1])%MOD;
    }
}

void pushdown(int l,int r,int rt)
{
    if(l==r)
        return;
    int mid = (l+r)>>1;
    int lc = rt<<1;
    int rc = rt<<1|1;
    LL delta;
    if(p1[rt]!=0)
    {
        p1[lc]=(p1[lc]+p1[rt])%MOD;
        sum[lc]=(sum[lc]+(p1[rt]*f1[mid-l+1]%MOD)+MOD)%MOD;
        delta=(p1[rt]*pw1[mid-l+1])%MOD;
        p1[rc]=(p1[rc]+delta+MOD)%MOD;
        sum[rc]=(sum[rc]+(delta*f1[r-mid])%MOD+MOD)%MOD;
        p1[rt]=0;
    }
    if(p2[rt]!=0)
    {
        p2[lc]=(p2[lc]+p2[rt])%MOD;
        sum[lc]=(sum[lc]-(p2[rt]*f2[mid-l+1]%MOD)+MOD)%MOD;
        delta=(p2[rt]*pw2[mid-l+1])%MOD;
        p2[rc]=(p2[rc]+delta+MOD)%MOD;
        sum[rc]=(sum[rc]-(delta*f2[r-mid])%MOD+MOD)%MOD;
        p2[rt]=0;
    }
}

void update(int l,int r,int rt)
{
    pushdown(l,r,rt);
    if(tl<=l&&r<=tr)
    {
        LL delta=pw1[l-tl+1];
        p1[rt]=(p1[rt]+delta)%MOD;
        sum[rt]=(sum[rt]+delta*f1[r-l+1]%MOD+MOD)%MOD;
        delta=pw2[l-tl+1];
        p2[rt]=(p2[rt]+delta)%MOD;
        sum[rt]=(sum[rt]-delta*f2[r-l+1]%MOD+MOD)%MOD;
    }
    else
    {
        int mid=(l+r)>>1;
        if(tl<=mid)  update(l,mid,rt<<1);
        if(tr>mid)  update(mid+1,r,rt<<1|1);
        sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%MOD;
    }
}

LL query(int L,int R,int l,int r,int rt)
{
    pushdown(l,r,rt);
    if(L<=l&&r<=R)
    {
        return sum[rt];
    }
    int mid=(l+r)>>1;
    if(R<=mid)  return query(L,R,l,mid,rt<<1);
    if(L>mid)   return query(L,R,mid+1,r,rt<<1|1);
    return (query(L,R,l,mid,rt<<1)+query(L,R,mid+1,r,rt<<1|1))%MOD;
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        a[i]=(a[i-1]+a[i])%MOD;
    }
    init();
    while(m--)
    {
        int op;
        scanf("%d%d%d",&op,&tl,&tr);
        if(op==1)
        {
            update(1,n,1);
        }
        else
        {
            LL ans=query(tl,tr,1,n,1);
            ans=(ans*inv)%MOD;
            ans=(ans+a[tr]-a[tl-1]+2*MOD)%MOD;
            if(ans<0)  ans=(ans+MOD)%MOD;
            printf("%lld\n",ans);
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Process: com.example.dzy, PID: 26008 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dzy/com.example.dzy.NavigationActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference at com.example.dzy.Fragment_1.<init>(Fragment_1.java:44) at com.example.dzy.NavigationActivity.initTab(NavigationActivity.java:39) at com.example.dzy.NavigationActivity.onCreate(NavigationActivity.java:27) at android.app.Activity.performCreate(Activity.java:7802) at android.app.Activity.performCreate(Activity.java:7791) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值