【AtCoder】【ARC064F】Rotated Palindromes

news/2024/7/6 10:34:07

Description

求有多少个序列满足以下条件:
1. 序列有n位;
2. 序列的每位为1~m之间的整数;
3. 这个序列经过旋转以后可以变成一个回文串;

Solution

这是一个悲惨的故事…..想了一天多,一直在想怎么减掉不合法的,最后一怒之下瞄了一眼(真的就是瞄一眼)标程,咦标称是直接统计耶,下一瞬间:
WOC这不是大水题吗

对于每个回文串,假设它旋转了x次以后第一次变成回文的,那么它对答案就有x的贡献(转0次~转x-1次),

考虑怎样的回文串转x次会变成回文的,(先假设x为n的约数)
把n切成(n/x)段,也就是每段有x个,
如果n/x为奇数,那么,只有这(n/x)段都相同且为回文的,它转x后还是回文的,
比如:(x=3,n=9)121 121 121;
如果n/x为偶数,那么, 这一段可以为任意,保证每(2x)位为一个回文串即可,
比如:(x=2,n=8)12 21 12 21;

根据上面计算方法,可得出,一个回文串如果转x次为回文串,那么转x的约数次也为回文串,(比如:转6次变成回文的,那么转12、18次也是回文的)

我们真正要统计的是,对于每个回文串,假设它旋转了x次以后第一次变成回文的,所以要减掉重复的,
显然,如果x不为n的约数,贡献为0,

复杂度可以参考枚举子集的复杂度,即 O(3x) O ( 3 x ) (大概),不会很大。

Code

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define efo(i,q) for(int i=A[q];i;i=B[i][0])
using namespace std;
typedef long long LL;
const int N=100500,mo=1e9+7;
int m,n;
int fj[N][2],fj0;
int d[N];
LL ans;
map<int,int>f;
LL ksm(LL q,int w)
{
    LL ans=1;
    for(;w;w>>=1,q=q*q%mo)if(w&1)ans=ans*q%mo;
    return ans;
}
int ss1(int q,int w,int e)
{
    if(q>w)return f[e];
    int ans=ss1(q+1,w,e);
    fo(i,1,d[q])((ans+=ss1(q+1,w,(e=e*fj[q][0])))>=mo?ans-=mo:0);
    return ans;
}
void ss(int q,int e)
{
    if(q>fj0)
    {
        LL t=(((n/e)%2?ksm(m,(e+1)>>1):ksm(m,e))-ss1(1,q,1)+mo)%mo;
        f[e]=t;
        ans=(ans+t*e)%mo;
        return;
    }
    d[q]=0;ss(q+1,e);
    fo(i,1,fj[q][1])d[q]=i,ss(q+1,(e*=fj[q][0]));
}
int main()
{
    int q,w;
    scanf("%d%d",&n,&m);
    if(n==1)return printf("%d\n",m),0;
    q=n;
    for(int i=2;i*i<=q;++i)if(q%i==0)
    {
        for(fj[++fj0][0]=i;!(q%i);++fj[fj0][1],q/=i);
    }
    if(q>1)fj[++fj0][0]=q,fj[fj0][1]=1;
    ss(1,1);
    printf("%lld\n",(ans+mo)%mo);
    return 0;
}

http://www.niftyadmin.cn/n/2675410.html

相关文章

网站常见的反爬虫和应对方法

这几天在爬一个网站&#xff0c;网站做了很多反爬虫工作&#xff0c;爬起来有些艰难&#xff0c;花了一些时间才绕过反爬虫。在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。 从功能上来讲&#xff0c;爬虫一般分为数据采集&#xff0c;处理&#xff0c;储存三…

Android系统层Watchdog机制源码分析

一&#xff1a;为什么需要看门狗? Watchdog,初次见到这个词语是在大学的单片机书上, 谈到了看门狗定时器. 在很早以前那个单片机刚发展的时候, 单片机容易受到外界工作影响, 导致自己的程序跑飞, 因此有了看门狗的保护机制, 即:需要每多少时间内都去喂狗, 如果不喂狗, 看门狗将…

【AtCoder】【ARC072F】Dam

Description 有一坐体积为m的水库&#xff0c;每天早上会有水流进来&#xff0c;晚上会放水&#xff0c; 每天流进来的水的温度和体积都可能不同&#xff0c;俩温度不同的水混合后的温度为&#xff1a;t1∗v1t2∗v2v1v2t1∗v1t2∗v2v1v2&#xff0c; 假设水的温度不受其他因…

SQL——实例记录(日期函数转换)

{转} 一般有以下几种转换方式&#xff0c;可根据实际需要选用&#xff1a; select Convert(varchar(10),getdate(),120)2006-05-12 select CONVERT(varchar, getdate(), 120 )2006-05-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),-,), ,),:…

springMVC:HandlerInterceptor拦截器的使用

2019独角兽企业重金招聘Python工程师标准>>> 1.使用背景 Web项目中需要判断http接口用户Post上来的数据是否合法&#xff0c;如果不合法要另做处理&#xff0c;用户Post上来的数据是Json形式的&#xff0c;我们用了RequestBody标记自动将json形式的提交封装为一个Mo…

【AtCoder】【ARC072E】Alice in linear land

Description 在数轴上有一个点&#xff0c;开始在原点&#xff0c;它要到位置T&#xff0c; 有一个操作序列&#xff0c;第i个元素为xixi&#xff0c;每次它会判断&#xff0c;如果它走了xixi个单位距离会离T更近&#xff0c;那么它就会走&#xff0c;否则原地不动&#xff0…

Web前端开发推荐书籍

Web前端开发推荐书籍 前言 学校里没有前端的课程&#xff0c;那如何学习JavaScript&#xff0c;又如何使自己成为一个合格的前端工程师呢&#xff1f; 读 书吧~相对于在网上学习&#xff0c;在项目中学习和跟着有经验的同事学习&#xff0c;书中有着相对完整的知识体系&#xf…

第 105 章 Ganglia

Ganglia是一个集群监控软件 Ganglia 是一个开源项目&#xff0c;它为高性能计算系统&#xff08;例如集群和网格&#xff09;提供了一个免费的可扩展分布式监视系统。 105.1. Server sudo apt-get install ganglia-monitor ganglia-webfrontendRestart apache2? 选择 Yessudo …