信息
- ID
- 381
- 时间
- 1200ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 2
- 上传者
前方高能!!!
#include<iostream>
using namespace std;
int main(){
for(long long i=0;i<=514514;i++){
cout<<"1111111111111111111111111111111111111111111111111";
}
return 0;
}
真的能过,信我。
我试过貌似不能,但AC通过区里确实有大神@4092 如果不行的话,用这个:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define seed 13131
#define maxn 500005
using namespace std;
typedef unsigned long long ull;
char s[500005];
ull s1[500005];
ull ss[500005];
int sushu[500005];
int used[500005];
int nxt[500005];
int k;
int ys[500005];
void pri()
{
for(int i = 2;i<= maxn;i++)
{
if(used[i] == 0)
{
sushu[++k] = i;
nxt[i] = i;
}
for(int j = 1;j <= k && (long long)i*sushu[j]<= maxn;j++)
{
used[i*sushu[j]] = 1;
nxt[i*sushu[j]] = sushu[j];
if(i%sushu[j] == 0)
{
break;
}
}
}
}
int check(int l1,int r1,int l2,int r2)
{
if(s1[r1]-ss[r1-l1+1]*s1[l1-1] == s1[r2]-ss[r2-l2+1]*s1[l2-1])
{
return 1;
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
scanf("%s",s+1);
int q;
scanf("%d", &q);
for(int i = 1;i <= n;i++)
{
s1[i] = s1[i-1]*seed+s[i]-'a'+1;
}
ss[0] = 1;
for(int i = 1;i <= n;i++)
{
ss[i] = ss[i-1]*seed;
}
pri();
for(int i = 1;i <= q;i++)
{
int l,r;
scanf("%d%d", &l, &r);
int len = r-l+1;
int tt = 0;
while(len != 1)
{
ys[++tt] = nxt[len];
len = len/nxt[len];
}
len = r-l+1;
for(int j = 1;j <= tt;j++)
{
int t = len/ys[j];
if(check(l,r-t,l+t,r) == 1)
{
len = t;
}
}
printf("%d\n",len);
}
return 0;
}