UOJ Logo TKD的博客

博客

求教

2014-11-11 13:30:19 By TKD

为啥我的时间复杂度不够小?

D2T3

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define MOD1 1000000010
#define MOD2 1000000008
using namespace std;
struct BIG_NUM
{
    long long s[10010];
    int l;
}k[110];
long long ss[10010];
int next[1000010],last[1000010];
int n,m,flag[110],flags[1000010];
int ans[1000010],nums,numo;
long long o[110][4];
long long mod_it(BIG_NUM u,int d)
{
    long long b=1000000000000000000%d;
    for(int i=u.l;i>=1;i--)
    {
        long long p=u.s[i]%d;
        if(i-1!=0)
            u.s[i-1]+=(b*p)%d;
        else
            return p;
    }
    return 0;
}
void get_it(int x)
{
    char c[10010];
    scanf("%s",c);
    int len=strlen(c);
    if(c[0]=='0'&&len==1)
    {
        k[x].l=0;
        return;
    }
    if(c[0]=='-')
    {
        flag[x]=1;
        int nows=0;
        k[x].l=(len+16)/18;
        for(int i=len-1;i>=1;i-=18)
        {
            nows++;
            for(int j=max(i-17,1);j<=i;j++)
            {
                k[x].s[nows]*=10;
                k[x].s[nows]+=(c[j]-'0');
            }
        }
        return;
    }
    int nows=0;
    k[x].l=(len+17)/18;        
    for(int i=len-1;i>=0;i-=18)
    {
        nows++;
        for(int j=max(i-17,0);j<=i;j++)
        {
            k[x].s[nows]*=10;
            k[x].s[nows]+=(c[j]-'0');
        }
    }
    return;
}
void read_in()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++)
        get_it(i);
    return;
}
void about_zero()
{
    for(int i=1;i<=m;i++)
    {
        next[i]=i+1;
        last[i]=i-1;
    }
    for(int i=1;i<=m;i=next[i])
    {
        if(mod_it(k[0],i)==0)
        {
            nums++;
            ans[nums]=i;
            continue;
        }
        for(int j=2*i;j<=m;j+=i)
        {
            if(flags[j])
                continue;
            flags[j]=1;
            next[last[j]]=next[j];
            last[next[j]]=last[j];
        }
    }
    return;
}
void judge_them()
{
    for(int i=0;i<=n;i++)
    {
        o[i][1]=mod_it(k[i],MOD1);
        o[i][2]=mod_it(k[i],MOD2);
    }
    for(int i=1;i<=nums;i++)
    {
        long long p=ans[i],c[3];
        long long ans1[3],ans2[3];
        ans1[1]=0;
        ans1[2]=0;
        ans2[1]=0;
        ans2[2]=0;
        c[1]=1;
        c[2]=1;
        for(int j=0;j<=n;j++)
        {
            if(flag[j])
            {
                ans1[1]+=(o[j][1]*c[1])%MOD1;
                ans1[2]+=(o[j][2]*c[2])%MOD2;
            }
            else
            {
                ans2[1]+=(o[j][1]*c[1])%MOD1;
                ans2[2]+=(o[j][2]*c[2])%MOD2;
            }
            c[1]=(c[1]*p)%MOD1;
            c[2]=(c[2]*p)%MOD2;
        }
        ans1[1]%=MOD1;
        ans1[2]%=MOD2;
        ans2[1]%=MOD1;
        ans2[2]%=MOD2;
        if(ans1[1]==ans2[1]&&ans1[2]==ans2[2])
        {
            numo++;
            ans[numo]=ans[i];
        }
    }
    return;
}
void put_out()
{
    printf("%d\n",numo);
    for(int i=1;i<=numo;i++)
        printf("%d\n",ans[i]);
    return;
}
int main()
{
    freopen("equation.in","r",stdin);
    freopen("equation.out","w",stdout);
    read_in();
    about_zero();
    judge_them();
    put_out();
}

难道是a0太坑了?1~100000都是它的约数?

。。。。。。。不明白

O(a0的约数个数 乘 压位的高精度(约555)+a0的约数个数 乘 n)

(吐槽一下,markdown打不出乘号。。。。)

求为何爆时限







看啥看,我是个蒟蒻~

评论

vfleaking
这个显然会超时吧。。。? (话说你可以用“\*”……= =……)
ydc
a0的约数个数 乘 压位的高精度?你确定做到了a0的约数个数 乘 压位的高精度吗?
TKD
@vfleaking 。。。关键在于,我比赛时没用啊。。。。。 而且Day2第一题还爆了。。。。。。。 我的五百啊啊啊啊啊啊啊(我是弱省蒟蒻) ---------------------------------------------------------------- 看啥看,我是个蒟蒻~

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。