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;
}

 

posted @ 2018-05-08 13:43  AKCqhzdy  阅读(131)  评论(0编辑  收藏  举报