ARC107 B - Quadruple(差分)

这篇博客介绍了如何通过差分预处理技巧高效计算当a+b-c-d等于常数k时,所有可能组合的方案数。博主详细展示了如何构造递推关系f(i+k)=k+f(i),并利用这个关系进行O(n)复杂度的枚举求解,最终给出了一段C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

在这里插入图片描述

解法:

a+b−c−d=k(a+b)−(c+d)=k(a+b)=k+(c+d)设f(i)为a+b=i的方案数,那么式子可以变为:f(i+k)=k+f(i)f(i)可以利用差分预处理枚举i,答案累加f(i)∗f(i+k).a+b-c-d=k\\ (a+b)-(c+d)=k\\ (a+b)=k+(c+d)\\ 设f(i)为a+b=i的方案数,那么式子可以变为:\\ f(i+k)=k+f(i)\\ f(i)可以利用差分预处理\\ 枚举i,答案累加f(i)*f(i+k). a+bcd=k(a+b)(c+d)=k(a+b)=k+(c+d)f(i)a+b=i,:f(i+k)=k+f(i)f(i)i,f(i)f(i+k).

code:
#include<bits/stdc++.h>
#define int long long
//#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;
const int mod=998244353;
int f[maxm];
int n,k;
void solve(){
    cin>>n>>k;
    //f[i]为a+b=i的方案数,差分可以O(n)预处理
    for(int i=1;i<=n;i++){//枚举a,b的取值为[1,n]
        f[i+1]++;
        f[i+n+1]--;
    }
    for(int i=1;i<maxm;i++){
        f[i]+=f[i-1];
    }
    //
    int ans=0;
    for(int i=1;i<maxm;i++){
        if(k+i>=0&&k+i<maxm){
            ans+=f[i]*f[k+i];
        }
    }
    cout<<ans<<endl;
}
signed main(){
    solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值