首页 > 其他 > 详细

ybtoj 43.B 周期字符串

时间:2021-06-07 16:09:04      阅读:23      评论:0      收藏:0      [点我收藏+]

【题意】
技术分享图片

 

 【分析】

设$f_i$表示循环节长度为i的字符串的个数

设$g_i$表示循环节长度为i的因数的字符串个数

容易求出$g_i=26^i$,因为所有长度为i的字符串的循环节长度一定都是i的因数

然后我们利用莫比乌斯反演可以求出$f_n=\sum_{d|n}g(d)\mu(n/d)$

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e8+5;
const int mod=1e9+7;
int n;
int mu(int x)
{
    int res=1;
    for(int i=2;1LL*i*i<=x;i++)
    {
        if(x%i!=0) continue;
        int cnt=0;
        while(x%i==0) x/=i,cnt++;
        if(cnt>=2) return 0;
        res*=-1;
    }
    if(x>1) res*=-1;
    return res; 
}
int qpow(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=1LL*res*a%mod;
        a=1LL*a*a%mod;
        b>>=1;
    }
    return res;
}
int main()
{
    // freopen("a.in","r",stdin);
    // freopen("a.out","w",stdout);
    scanf("%d",&n);
    int lim=sqrt(n);
    int ans=0;
    for(int i=1;i<=lim;i++)
    {
        if(n%i!=0) continue; 
        ans=(ans+1LL*qpow(26,i)*mu(n/i)%mod+mod)%mod;
        if(i*i!=n) ans=(ans+1LL*qpow(26,n/i)*mu(i)%mod+mod)%mod;
    }
    printf("%d",(ans+mod)%mod);
    return 0;
}

 

ybtoj 43.B 周期字符串

原文:https://www.cnblogs.com/andylnx/p/14858264.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!