ARC107 B - Quadruple(差分)

题意:

在这里插入图片描述

解法:

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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值