[银联复赛]-整数对:数论
题链:计蒜客
题意
给定(n,m,p(1leq n,m leq 10^9,1 leq p leq 10^5)),求满足(a*b=k*p(1 leq a leq n,1leq b leq m,k为任意整数))的整数对((a,b))的数量
思路
本题最精彩的部分是(a)的构造:(k)为自由变量,假设(k_1=a/p,r=a\%p(除法为高级语言的除法),则a=k_1*p+r)
这里添加一点解释:
[1 leq a leq n并且a=k_1*p+r Rightarrow k_1=frac{(n-r)}{p},(k_1)_{max}=x=(n/p) $$.
$r$是自由变量,故需要枚举$r$的值,某一确定的$r$值下,整数对的个数为$k_1$的种数乘上在m范围内b的可取种数
### AcCode
```c++
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
LL n,m,p,t,a,b,x;
LL res;
int main(){
cin>>t;
while(t--){
res=0;
cin>>n>>m>>p;
x=n/p;
for(LL r=0;r<p;r++){//枚举r的取值
if(r==0)a=x;//[0,x]
else if(r>0&&r<=n%p)a=x+1;
else a=x;
b=m/(p/__gcd(r,p));
res+=a*b;
}
cout<<res<<endl;
}
return 0;
}
```]