QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#185737 | #4375. String | 321625 | RE | 0ms | 0kb | C++14 | 1.1kb | 2023-09-22 15:58:59 | 2023-09-22 15:58:59 |
answer
#include<cstdio>
#include<cstring>
const int N=5e6+7,mod=998244353;
typedef long long ll;const ll Mod=mod;
char s[N];int fail[N];
void gfail(char*s)
{
for(int i=0,j=*fail=-1;s[i];)
if(j==-1||s[i]==s[j])fail[++i]=++j;
else j=fail[j];
}
int k,g[N],p[N],zg[N];
inline int cdiv(int a,int b){return (a-1)/b+1;}
int F(int n)
{
// printf("ans[%d]",n);
int mn=n/2+1,ans=0;bool flg=1;
while(flg)
{
int d=n-fail[n],lw=n%d;
if(lw<mn)flg=0,lw+=cdiv(mn-lw,d)*d;
int t=(n-2*lw%k+k)%k,zz=(d+d)%k;
// printf("t=%d k=%d zz=%d nt=%d(lw=%d,d=%d)\n",t,k,zz,(n-lw)/d,lw,d);
if(!(t%g[zz]))
{
int ps=((ll)p[zz]*(t/g[zz]))%zg[zz],nt=(n-lw)/d;
if(nt>=ps)ans+=(nt-ps)/zg[zz]+1;
}
n=lw;
}
// printf("=%d\n",ans);
return ans;
}
int exgcd(int a,int b,int&x,int&y)
{
if(!b){x=1;y=0;return a;}
int t=exgcd(b,a%b,y,x);y-=a/b*x;
return t;
}
int main()
{
scanf("%s%d",s+1,&k);gfail(s+1);int n=strlen(s+1),ans=1;
for(int i=0,z;i<k;++i)g[i]=exgcd(i,k,p[i],z),zg[i]=k/g[i],p[i]=(p[i]+zg[i])%zg[i];
for(int i=1;i<=n;++i)ans=ans*(F(i)+1LL)%Mod;printf("%d",ans);
return 0;
}
详细
Test #1:
score: 0
Runtime Error
input:
10 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk...