蓝桥杯小白入门赛第二期 取余

107 阅读1分钟

4.取余【算法赛】 - 蓝桥云课 (lanqiao.cn)

dfs

刚开始我想的是dfs,但是爆栈了

image.png

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