题目描述
码队的弟弟喜欢做数学题。这不,听说你也喜欢做数学题,码队的弟弟非常高兴,决定立刻送给你一道数学题,请你完成。
给定三个整数 n,m,pn,m,p ,求满足 a imes b = k imes pa×b=k×p (( 1 le a le n, 1 le b le m, k1≤a≤n,1≤b≤m,k为任意正整数 ))的整数对 (a,b)(a,b) 的数量。
输入格式
有多组数据。
第一行输入一个整数,表示有 TT 组数据( 1 le T le 101≤T≤10 )。
对于每一组测试数据:输入一行,包含三个整数 n,m,pn,m,p ,以空格分隔( 1 le n,m le 10^9, 1 le p le 10^51≤n,m≤109,1≤p≤105 )。
输出格式
对于每一组数据,输出一行。
每行只包含一个整数,表示满足条件的整数对的数量。
提示
针对样例输入1:一共有 55 个整数对,分别是 (1,3),(2,3),(3,3),(3,1),(3,2)(1,3),(2,3),(3,3),(3,1),(3,2)。
样例输入1
1 3 3 3
样例输出1
5
样例输入2
1 10 20 15
样例输出2
29
#include <bits/stdc++.h> #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int maxn=5e5+5,lim=3e5; int T; ll n,m; int p; ll ans=0; int main(){ //freopen("1.txt","r",stdin); scanf("%d",&T); while(T--){ ans=0; scanf("%lld%lld%d",&n,&m,&p); ll pre=n/p; for(register int i=0;i<p;++i){ ll cur=m/(p/__gcd(i,p)); if(i==0){ ans+=pre*cur; } else if(i>0&&i<=n%p){ ans+=(pre+1)*cur; } else if(i>n%p&&i<p){ ans+=pre*cur; } } printf("%lld ",ans); } return 0; }