推式子
设: 表示 唯一分解后所有质因子指数之和
我们发现
,故
所以
最多有18个质因子
如果
,那么所有对都可以,答案为
对于
,先考虑:
设 ,根据莫比乌斯反演有:
所以:
前面的可以分块解决,后面的前缀和处理
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T>
void out(T x) { cout << x << endl; }
ll fast_pow(ll a, ll b, ll p) {ll c = 1; while(b) { if(b & 1) c = c * a % p; a = a * a % p; b >>= 1;} return c;}
ll exgcd(ll a, ll b, ll &x, ll &y) { if(!b) {x = 1; y = 0; return a; } ll gcd = exgcd(b, a % b, y, x); y-= a / b * x; return gcd; }
const int N = 5e5 + 5;
int prime[N], mu[N], num[N], tot;
bool mark[N];
ll nump[N][20];
void get_mu()
{
memset(nump, 0, sizeof(nump));
mu[1] = 1;
num[1] = 0;
mark[1] = mark[0] = true;
tot = 0;
for(int i = 2; i < N; i ++)
{
if(!mark[i])
{
prime[tot ++] = i;
mu[i] = -1;
num[i] = 1;
}
for(int j = 0; j < tot && i * prime[j] < N; j ++)
{
mark[i * prime[j]] = true;
num[i * prime[j]] = num[i] + 1;
if(i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
mu[i * prime[j]] = -mu[i];
}
}
for(int i = 1; i < N; i ++)
for(int j = i; j < N; j += i)
nump[j][num[i]] += mu[j / i];
for(int i = 1; i < N; i ++)
for(int j = 1; j < 19; j ++)
nump[i][j] += nump[i][j - 1];
for(int i = 1; i < N; i ++)
for(int j = 0; j < 19; j ++)//gcd为1,num[gcd]=0
nump[i][j] += nump[i - 1][j];
}
ll cal(ll n, ll m, ll p)
{
if(n > m)
swap(n, m);
ll ans = 0;
for(ll i = 1, j = 1; i <= n; i = j + 1)
{
j = min(n / (n / i), m / (m / i));
ans += (n / i) * (m / i) * (nump[j][p] - nump[i - 1][p]);
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
get_mu();
int t;
cin >> t;
while(t --)
{
ll n, m, p;
cin >> n >> m >> p;
if(p > 18)
{
cout << n * m << endl;
continue;
}
cout << cal(n, m, p) << endl;
}
}