BZOJ3529
来自蒟蒻XXJ的做题记录
日常%%%%PoPoQQQ dalao
dalao ppt 传送门:http://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html
PS:我下次再写错
位运算
就吃X
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100010;
int in(){
int a(0);char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
return a;
}
int t,cnt;
int f[MAXN],mu[MAXN];
int rkf[MAXN],rkq[MAXN],prime[MAXN],mark[MAXN];
int n[MAXN],m[MAXN],a[MAXN],res[MAXN];
int tree[MAXN];//d's BIT
void add(int pos,int k){
for(int i=pos;i<MAXN;i+=(i&-i)) tree[i]+=k;
}
int query(int pos){
int ans(0);
for(int i=pos;i;i-=(i&-i)) ans+=tree[i];
return ans;
}
bool cmp1(int i,int j){
return f[i]<f[j];
}
bool cmp2(int i,int j){
return a[i]<a[j];
}
void init_F(){
for(int i=1;i<MAXN;i++)
for(int j=i;j<MAXN;j+=i) f[j]+=i;
for(int i=1;i<MAXN;i++) rkf[i]=i;
sort(rkf+1,rkf+MAXN,cmp1);
}
void init_mu(){
mu[1]=1;
for(int i=2;i<MAXN;++i){
if(!mark[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]>=MAXN) break;
mark[i*prime[j]]=1;
if(!(i%prime[j])) {mu[i*prime[j]]=0;break;}
else mu[i*prime[j]]=-mu[i];
}
}
}
void init(){
for(int i=1;i<=t;i++) rkq[i]=i;
sort(rkq+1,rkq+t+1,cmp2);//pre do
}
void input(){
t=in();
for(int i=1;i<=t;++i){
n[i]=in();m[i]=in();a[i]=in();
}
init();
init_F();
init_mu();
}
void xxj(){
int pos(1);
for(int i=1;i<=t;i++){
int id=rkq[i];
int now=a[id],p=rkf[pos];
while(f[p]<=now){
for(int j=p;j<MAXN;j+=p){
add(j,f[p]*mu[j/p]);
}
++pos;p=rkf[pos];
}
for(int d=1,last;d<=min(n[id],m[id]);d=last+1){
last=min(n[id]/(n[id]/d),m[id]/(m[id]/d));
res[id]+=(n[id]/d)*(m[id]/d)*(query(last)-query(d-1));
}
}
}
void output(){
for(int i=1;i<=t;i++) printf("%d\n",res[i]&0x7fffffff);
}
int main(){
input();
xxj();
output();
return 0;
}