bzoj3529: [Sdoi2014] Number table

This question doesn't seem so difficult now.

The problem solution is not written, and the paper of popoQQQ is very clear.

Get stuck to death. LOJACbzojTLE becomes SB

That takes mod, it is %2^31, so it can be directly overflowed naturally. . . . Finally and a 2147483647 will do.

A mod is so scary, if you delete it, it will take 3632ms, if you don't delete it, it will take 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;}

intmain ()
{
    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;
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325927984&siteId=291194637