bzoj3529
参考PoPoQQQ神的莫比乌斯反演ppt
取模利用自然溢出int 最后再对2^31-1取与。不然会超时QAQ。
写代码传参数的时候传炸了。。调试了极久
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int M;
int prime[N],tot;
int mu[N];
void Mu()
{
mu[1]=1;
for (int i=2;i<N;i++){
if (!prime[i]){
prime[++tot] = i;
mu[i]=-1;
}
for (int j=1;prime[j]*i<N;j++){
prime[ prime[j]*i ] = 1;
if (i%prime[j]==0){
mu[ prime[j]*i ] = 0;
break;
}
mu[ prime[j]*i ] = -mu[i];
}
}
//for (int i=1;i<100;i++) printf("%d %d\n",i,mu[i]);
}
struct Node{
int v;
int id;
Node(){}
Node(int id,int v):id(id),v(v){}
bool operator <(const Node&a)const{
return v<a.v;
}
};
struct Query{
int n,m;
int a;
int ans;
int id;
Query(){}
Query(int n,int m,int a,int id):n(n),m(m),a(a),id(id){}
};
bool cmp1(Query a,Query b){return a.a<b.a;}
bool cmp2(Query a,Query b){return a.id<b.id;}
Query Q[N];
Node f[N];
int T[N];
void getF(){
for (int i=1;i<N;i++){
for (int j=i;j<N;j+=i){
f[j].v+=i;
}
f[i].id=i;
}
//for (int i=1;i<10;i++) printf("%d %d\n",i,f[i]);
}
void add_T(int x,int v)
{
for (;x<N;x+=x&(-x)) T[x]+=v;
}
void add(int id,int v)
{
for (int x=id;x<N;x+=id){
add_T(x,v*mu[x/id]);
}
}
int sum_T(int x){
int ans=0;
for (;x;x-=x&(-x))ans+=T[x];
return ans;
}
int calc(int n,int m){
if (n>m)swap(n,m);
int last=0;
int ans=0;
for (int i=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
ans+=(n/i)*(m/i)*(sum_T(last)-sum_T(i-1));
}
return ans;
}
int main()
{
freopen("1.txt","r",stdin);
freopen("test.txt","w",stdout);
for (int i=0;i<=30;i++) M = M | (1<<i);
Mu();getF();
int Case;scanf("%d",&Case);
for (int i=1;i<=Case;i++){
scanf("%d%d%d",&Q[i].n,&Q[i].m,&Q[i].a);
Q[i].id = i;
}
sort(Q+1,Q+Case+1,cmp1);
sort(f+1,f+N);
int fn=1;
int ans=0;
for (int i=1;i<=Case;i++){
while (fn<N && (f[fn].v <= Q[i].a)){
add(f[fn].id,f[fn].v);
fn++;
}
Q[i].ans=calc(Q[i].n,Q[i].m);
}
sort(Q+1,Q+Case+1,cmp2);
for (int i=1;i<=Case;i++) printf("%d\n",Q[i].ans&M);
return 0;
}