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

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/115255031
今日推荐