dfs
刚开始我想的是dfs,但是爆栈了
#include <iostream>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
vector<PII>path;
int A,B,S,T;
int res;
vector<vector<int>>result;
void dfs(int index)
{
for(int i=index;i<=A;i++)
{
for(int j=index;j<=B;j++)
{
res=i%j;
if(res>=S&&res<=T) {result.push_back({i,j});break;}
dfs(j+1);
}
}
}
int main()
{
cin>>A>>B>>S>>T;
dfs(1);
cout<<result.size()<<endl;
return 0;
}
数学
这道题正统解法是数学:
我们枚举b,用(1~a)分别modbb:
当b=1时,(1-a)%b的结果分别为:{0,0,0},没有满足条件的数对。
当b=2时,(1~a)%b的结果分别为:{1,0,1},满足条件的数对(1,2),(3,2)
当b=3时,(1~a)%b的结果分别为:{1,2,0}。满足条件的数对(1,3),(2,3)
一共有4对数对满足条件
code
代码逻辑:基于A数组的每个元素和b进行取模运算的结果来判断是否满足条件。满足条件则更新差分数组a。然后,再通过另一个for循环来统计满足条件的数对的数量。
#include<iostream>
#define int long long
using namespace std;
const int N=1e7+10;
int A,B,S,T;
int sum;
int a[N],b[N];//原数组 ,差分数组
void sovel()
{
cin>>A>>B>>S>>T;
for(int i=1;i<=B;i++)//枚举[1~B]
{
a[0]+=A/i;
a[i]-=A/i;
a[1]++;
a[A%i+1]--;
}
int sum=0,ans=0;
for(int i=0;i<=T;i++)
{
sum+=a[i];
if(i>=S)
ans+=sum;
}
cout<<ans;
}
signed main()
{
sovel();
return 0;
}