• 51Nod 1317 相似字符串对


    前两天上课讲的题,还是比较simple的

    考虑对于相似字符串的操作,不难发现两个字符串相似当且仅当它们循环同构

    因此我们可以枚举循环节的长度(i),那么和他循环同构的串的个数显然就是(i)

    接下来就是计算循环节长为(i)的方案数了,我们不难想到可以在最短循环节长度处统计答案,因此直接大力容斥即可

    复杂度(O(pi(n)^2))

    #include<cstdio>
    #include<algorithm>
    #define RI register int
    #define CI const int&
    using namespace std;
    const int N=100005,mod=1e9+7;
    int n,k,d[N],cnt,f[N],ans;
    inline int quick_pow(int x,int p,int mul=1)
    {
    	for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
    }
    inline void inc(int& x,CI y)
    {
    	if ((x+=y)>=mod) x-=mod;
    }
    inline void dec(int& x,CI y)
    {
    	if ((x-=y)<0) x+=mod;
    }
    int main()
    {
    	RI i,j; for (scanf("%d%d",&n,&k),i=1;i*i<=n;++i)
    	if (n%i==0) d[++cnt]=i,(n!=i*i)&&(d[++cnt]=n/i);
    	for (sort(d+1,d+cnt+1),i=1;i<=cnt;++i)
    	for (f[i]=quick_pow(k,d[i]),j=1;j<i;++j) if (d[i]%d[j]==0) dec(f[i],f[j]);
    	for (i=1;i<=cnt;++i) inc(ans,1LL*f[i]*d[i]%mod);
    	return printf("%d",ans),0;
    }
    
  • 相关阅读:
    Redis设置生存时间或过期时间的相关命令
    .Net Core使用Redis
    Redis的数据类型
    Java集合 使用Collections
    Java集合 使用Iterator
    Java集合 使用Stack
    响应式常用样式汇总
    图片 文字 背景等响应式设置总结
    微信动态聊天工具
    第2章 栅格系统
  • 原文地址:https://www.cnblogs.com/cjjsb/p/13533156.html
Copyright © 2020-2023  润新知