为啥我的时间复杂度不够小?
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打不出乘号。。。。)
求为何爆时限
看啥看,我是个蒟蒻~