Codeforces Round #701 (Div. 2) Floor and Mod

74 阅读1分钟

题目链接

思路

ab=amodb=k\lfloor\frac{a}{b}\rfloor=a\mod b=k,那么a=kb+ka=kb+k

又因为k<bk<b,所以k<xk<\sqrt x(不然aa表达式那里就乘爆了)。所以考虑从1x1\rightarrow \sqrt x枚举kk,计算对于这个kk,有多少满足条件的a,ba,b

因为axa\leq x,所以有kb+kxkb+k\leq x,得到bb的取值范围是k<bmin(y,xkk)k<b\leq min(y,\frac{x-k}{k}),那么符合条件的bb的个数就是min(y,xkk)kmin(y,\frac{x-k}{k})-k

代码

#include<bits/stdc++.h>
#define rep(i,st,ed) for(int i=st;i<=ed;++i)
#define bl(u,i) for(int i=head[u];i;i=e[i].nxt)
#define en puts("")
#define LLM LONG_LONG_MAX
#define LLm LONG_LONG_MIN
#define pii pair<ll,ll> 
typedef long long ll;
typedef double db;
using namespace std;
const ll INF=0x3f3f3f3f;
void read() {}
void OP() {}
void op() {}
template <typename T, typename... T2>
inline void read(T &_, T2 &... oth)
{
    int __=0;
    _=0;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            __=1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        _=_*10+ch-48;
        ch=getchar();
    }
    _=__?-_:_;
    read(oth...);
}
template <typename T>
void Out(T _)
{
    if(_<0)
    {
        putchar('-');
        _=-_;
    }
    if(_>=10)
       Out(_/10);
    putchar(_%10+'0');
}
template <typename T, typename... T2>
inline void OP(T _, T2... oth)
{
	Out(_);
	putchar('\n');
	OP(oth...);
}
template <typename T, typename... T2>
inline void op(T _, T2... oth)
{
	Out(_);
	putchar(' ');
	op(oth...);
}
/*#################################*/
void solve()
{
	ll x,y;
	read(x,y);
	ll lim=sqrt(x),ans=0;
	rep(k,1,lim)
		ans+=max(0ll,min(y,(x-k)/k)-k);
	OP(ans);
}
int main()
{
	int _;
	cin>>_;
	while(_--)
	{
		solve();
	}
}