J题智乃的C语言模除方程

题目改成查询从u到0,有多少个数出现过,分成两部分,一部分是u % p的部分,一部分是每一份为0 ~ p -1(注意分正负考虑),有 u / p 份。两份加起来就是答案

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>

using namespace std;

typedef long long ll ;
int p,l,r,L,R ;

int get_intersection(int a,int b,int c,int d){ //返回[a,b],与[c,d]交集长度
    if(c > b || d < a) return 0;
    return min(d,b) - max(a,c) + 1 ;
}

int query(int u){  // 可以查询从u到0,有多少个数出现过,分成两部分,一部分是u % p的部分,一部分是有 u / p 份,每一份为0 ~ p -1(注意分正负考虑)
    if(u < 0) return (int)abs(u / p) * get_intersection(-p+1,0,l,r) + get_intersection(u % p,0,l,r) ;
    return (int)(u / p) * get_intersection(0,p-1,l,r) + get_intersection(0,u % p,l,r) ;
}

int main(){
    
    cin >> p >> l >> r >> L >> R ;
    p = abs(p) ;
    
  	int ans = 0 ;  
  	
 	// 类似前缀和思路
    if(L <= 0 && R >= 0) ans = query(L) + query(R) - query(0) ;  // L与R异号,多算一次0,所以删除0
    else if(L < 0 && R < 0) ans = query(L) - query(R+1) ;  // 都小于0
    else ans = query(R) - query(L - 1) ;  // 都大于0

    cout << ans << "\n" ;
    return 0;
}