BZOJ-3529 数表
![](https://www.nowcoder.com/equation?tex=Description&preview=true)
![](https://www.nowcoder.com/equation?tex=Calculate%20%5Cquad%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Csum_%7Bj%3D1%7D%5E%7Bm%7Df(gcd(i%2Cj))&preview=true)
![](https://www.nowcoder.com/equation?tex=f(n)%3D%0A%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%0A%200%26%20%2C%20%26%20%5Csum_%7Bd%7Cn%7Dd%3Ea%5C%5C%20%0A%20%5Csum_%7Bd%7Cn%7Dd%20%26%20%2C%20%26%20%5Csum_%7Bd%7Cn%7Dd%20%5Cleq%20a%0A%5Cend%7Bmatrix%7D%5Cright.&preview=true)
![](https://www.nowcoder.com/equation?tex=Solution&preview=true)
![](https://www.nowcoder.com/equation?tex=%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Csum_%7Bj%3D1%7D%5E%7Bm%7Df(gcd(i%2Cj))%3D%5Csum_%7BT%3D1%7D%5E%7Bn%7D%5Cleft%20%5Clfloor%20%5Cfrac%7Bn%7D%7BT%7D%20%20%5Cright%20%5Crfloor%20%5Ccdot%20%5Cleft%20%5Clfloor%20%5Cfrac%7Bm%7D%7BT%7D%20%20%5Cright%20%5Crfloor%20%5Csum_%7Bd%7CT%7Df(d)%5Ccdot%20%5Cmu(%5Cfrac%7BT%7D%7Bd%7D)&preview=true)
![](https://www.nowcoder.com/equation?tex=g(n)%3D%5Csum_%7Bd%7Cn%7Df(d)%5Ccdot%20%5Cmu(%5Cfrac%7Bn%7D%7Bd%7D)%2C%E8%80%83%E8%99%91%E7%A6%BB%E7%BA%BF%EF%BC%8C%E5%AF%B9a%E4%BB%8E%E5%B0%8F%E5%88%B0%E5%A4%A7%E6%8E%92%E5%BA%8F%2C%E5%AF%B9%E6%AF%8F%E6%AC%A1%E5%B0%8F%E4%BA%8E%E7%AD%89%E4%BA%8Ea%E7%9A%84f(d)%E5%80%BC%E5%8A%A0%E5%88%B0g(n)%E4%B8%AD%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84%E7%BB%B4%E6%8A%A4%E3%80%82&preview=true)
![](https://www.nowcoder.com/equation?tex=Code&preview=true)
#include<bits/stdc++.h>
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
#define itn int
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
#define STR clock_t startTime = clock();
#define END clock_t endTime = clock();cout << double(endTime - startTime) / CLOCKS_PER_SEC *1000<< "ms" << endl;
using namespace std;
const int N=1e5+5;
const long long mod=1e9+7;
const long long mod2=998244353;
const int oo=0x7fffffff;
const int sup=0x80000000;
typedef long long ll;
typedef unsigned long long ull;
template <typename it>void db(it *begin,it *end){while(begin!=end)cout<<(*begin++)<<" ";puts("");}
template <typename it>
string to_str(it n){string s="";while(n)s+=n%10+'0',n/=10;reverse(s.begin(),s.end());return s;}
template <typename it>int o(it a){cout<<a<<endl;return 0;}
ll mul(ll a,ll b,ll c){ll ans=0;for(;b;b>>=1,a=(a+a)%c)if(b&1)ans=(ans+a)%c;return ans;}
ll ksm(ll a,ll b,ll c){ll ans=1;for(;b;b>>=1,a=mul(a,a,c))if(b&1)ans=mul(ans,a,c);return ans;}
void exgcd(ll a,ll b,ll &x,ll &y){if(!b)x=1,y=0;else exgcd(b,a%b,y,x),y-=(a/b)*x;}
unsigned int g[N]={0},ANS[N];
ll F[N]={0};
int prime[N],tot=0;
bool vis[N];
short int mu[N];
pair<ll,int>f[N];
struct node{
int n,m,a,id;
bool friend operator <(node x,node y){
return x.a<y.a;
}
}QQ[N];
void up(int id,unsigned int x){
for(int i=id;i<=100000;i+=i&(-i))g[i]+=x;
}
unsigned int Q(int id){
unsigned int ans=0;
for(int i=id;i;i&=i-1)ans+=g[i];
return ans;
}
void pre(){
mu[1]=1;
for(int i=2;i<N;i++){
if(!vis[i])prime[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*prime[j]<N;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<N;i++)
for(int j=i;j<N;j+=i)
F[j]+=i;
for(int i=1;i<N;i++)f[i]={F[i],i};
sort(f+1,f+N);
}
unsigned int solve(int n,int m){
unsigned int ans=0;
if(n>m)swap(n,m);
for(int i=1,last;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
ans+=(unsigned int)((n/i)*(m/i)*(Q(last)-Q(i-1)));
}
return ans;
}
int main(){
pre();
int t;cin>>t;
for(int i=1;i<=t;i++)sc("%d%d%d",&QQ[i].n,&QQ[i].m,&QQ[i].a),QQ[i].id=i;
sort(QQ+1,QQ+1+t);
int pos=0;
for(int cas=1;cas<=t;cas++){
while(pos+1<=100000&&QQ[cas].a>=f[pos+1].first){
pos++;
for(int i=f[pos].second;i<N;i+=f[pos].second)up(i,f[pos].first*mu[i/f[pos].second]);
}
ANS[QQ[cas].id]=solve(QQ[cas].n,QQ[cas].m);
}
for(int i=1;i<=t;i++)printf("%d\n",ANS[i]&oo);
}