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;
}
posted @ 2017-03-23 19:08  Xiaojian_xiang  阅读(225)  评论(0编辑  收藏  举报