bzoj3529: [Sdoi2014]数表
这题其实现在看来没那么难。
题解不写了,popoQQQ的论文讲的很清楚。
被卡常数至死。LOJACbzojTLE成SB
那个取mod啊,它是%2^31,所以说可以直接自然溢出。。。。最后and一个2147483647就可以了。
一个取mod这么恐怖,删了就3632ms,不删10sTLE
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int pr,prime[110000];bool v[110000]; int u[110000],sp[110000],yue_sum[110000]; void get_prime() { pr=0;u[1]=1;yue_sum[1]=1; memset(v,true,sizeof(v)); for(int i=2;i<=100000;i++) { if(v[i]==true) { prime[++pr]=i; u[i]=-1; sp[i]=i+1; yue_sum[i]=i+1; } for(int j=1;j<=pr&&i*prime[j]<=100000;j++) { v[i*prime[j]]=false; if(i%prime[j]==0) { u[i*prime[j]]=0; sp[i*prime[j]]=sp[i]*prime[j]+1; yue_sum[i*prime[j]]=yue_sum[i]/sp[i]*sp[i*prime[j]]; break; } u[i*prime[j]]=-u[i]; sp[i*prime[j]]=prime[j]+1; yue_sum[i*prime[j]]=yue_sum[i]*yue_sum[prime[j]]; } } } int Sid[110000]; bool SSSS_cmp(int n1,int n2){return yue_sum[n1]<yue_sum[n2];} int s[110000]; int lowbit(int x){return x&-x;} void change(int x,int k) { while(x<=100000) { s[x]+=k; x+=lowbit(x); } } int getsum(int x) { int ret=0; while(x>0) { ret+=s[x]; x-=lowbit(x); } return ret; } struct query { int n,m,a,id; }q[21000];int as[21000]; bool qqqq_cmp(query q1,query q2){return q1.a<q2.a;} int main() { freopen("g.in","r",stdin); freopen("g.out","w",stdout); get_prime(); for(int i=1;i<=100000;i++)Sid[i]=i; sort(Sid+1,Sid+100000+1,SSSS_cmp); int Q; Q=read(); for(int i=1;i<=Q;i++) { q[i].n=read(),q[i].m=read(),q[i].a=read(),q[i].id=i; if(q[i].n>q[i].m)swap(q[i].n,q[i].m); } sort(q+1,q+Q+1,qqqq_cmp); int tp=1; for(int i=1;i<=Q;i++) { for(;yue_sum[Sid[tp]]<=q[i].a&&tp<=100000;tp++) for(int j=1;Sid[tp]*j<=100000;j++) change(Sid[tp]*j,yue_sum[Sid[tp]]*u[j]); int last,ans=0; for(int k=1;k<=q[i].n;k=last+1) { last=min(q[i].n/(q[i].n/k),q[i].m/(q[i].m/k)); ans+=(q[i].n/k)*(q[i].m/k)*(getsum(last)-getsum(k-1)); } as[q[i].id]=ans; } for(int i=1;i<=Q;i++)printf("%d\n",as[i]&2147483647); return 0; }
pain and happy in the cruel world.