# [银联复赛]-整数对(数论)

[银联复赛]-整数对:数论

题链:计蒜客

题意

给定(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; } ```]

原文地址:https://www.cnblogs.com/sstealer/p/11378138.html