# [银联复赛]-整数对(数论)
[银联复赛]-整数对:数论
题链:计蒜客
题意
给定\(n,m,p(1\leq n,m \leq 10^9,1 \leq p \leq 10^5)\),求满足\(a*b=k*p(1 \leq a \leq n,1\leq 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;
}
```\]

浙公网安备 33010602011771号