[BZOJ5330][SDOI2018]反回文串

news/2023/12/8 16:43:52

luogu
bzoj

sol

枚举一个长度为\(n\)为回文串,它的所有循环位移都可以产生贡献。
但是这样算重了。重复的地方在于可能多个回文串循环同构,或者可能有的回文串经过小于\(n\)次循环位移后能够得到自身。
一个比较好的处理方式是:对每个回文串求最小的\(x\)使这个串经过\(x\)次循环位移后可以再次成为一个回文串。这样对每个回文串求\(\sum x\)显然就不会算重了。
考虑一个串的\(x\)是什么。显然会和这个串的最小循环节长度有关。实际上如果最小循环节长度为偶数,那么\(x\)就会是这个长度的一半;否则就等于这个长度。

形式化地,如果一个回文串的最小循环节长度为\(i\),那么它对答案的贡献就是\(h(i)=i\frac{1+[i\mbox{是奇数}]}{2}\)

设最小循环节为\(i\)的回文串共有\(f(i)\)个,那么我们要求的答案就是

\[Ans=\sum_{d|n}f(d)h(d)\]

又因为\[\sum_{d|n}f(d)=k^{\lceil\frac n2\rceil}=g(n)\]

所以\[f(n)=\sum_{d|n}g(d)\mu(\frac nd)\]

代入原式\[Ans=\sum_{d|n}\sum_{i|d}g(i)\mu(\frac di)h(d)\\=\sum_{i|n}g(i)\sum_{d|\frac ni}\mu(d)h(id)\]

我们希望可以把\(h(id)\)中的\(i\)提出来,这样后半部分就是一个关于\(\frac ni\)的函数了。

因为\(h(x)\)不是\(x\)就是\(\frac x2\),我们发现\(h(id)\neq d\times h(i)\)当且仅当\(i\)是奇数且\(d\)是偶数,而\(d|\frac ni\)所以\(d\)是偶数就说明\(\frac ni\)也是偶数。那么我们现在假设\(i\)是奇数且\(\frac ni\)是偶数,考虑下面这个式子的取值。

\[\sum_{d|\frac ni}\mu(d)h(id)\]

显然只有\(\mu(d)\)非零项有贡献,而\(\frac ni\)中含有\(2\)这个因子就使得所有\(\mu(d)\)非零项中含\(2\)与不含\(2\)\(d\)可以一一对应。他们的\(h(id)\)的值是相同的,而\(\mu(d)\)的值恰好相反,所以这个式子的值一定为\(0\)

话说回来。我们现在已经知道了\(h(id)\neq d\times h(i)\)的情况没有贡献,就可以放心大胆地用这一种变换了。

\[Ans=\sum_{i|n}g(i)\sum_{d|\frac ni}\mu(d)h(id)\\=\sum_{i|n}g(i)h(i)\sum_{d|\frac ni}d\mu(d)\]

(在枚举\(i\)时需要跳过\(i\)是奇数而\(\frac ni\)是偶数的项)

考虑后面的东西是个啥。还是只有\(\mu(d)\)非零项有贡献,也就是说含有奇数个质因子的\(d\)会乘上\(-1\),含有偶数个质因子的\(d\)为乘上\(1\),所以这个值相当于是将\(\frac ni\)质因数分解为\(p_1^{a_1}p_2^{a_2}...p_k^{a_k}\)后,为\(\prod_{i=1}^k(1-p_i)\)

所以到这里就比较简单了。先用\(Pollard-Rho\)算法将\(n\)分解,再dfs枚举\(n\)的每一个约数\(d\),在搜索的过程中自然可以求出那个\(\prod_{i=1}^k(1-p_i)\)

code

#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std;
#define ll long long
ll mul(ll x,ll y,ll m){x%=m;y%=m;return (x*y-(ll)(((long double)x*y+0.5)/(long double)m)*m+m)%m;
}
ll fastpow(ll x,ll y,ll m){ll res=1;while (y) {if (y&1) res=mul(res,x,m);x=mul(x,x,m);y>>=1;}return res;
}
ll f[]={2,3,5,7,11,13,17,19,23,29};
bool MR(ll p){for (int i=0;i<10;++i){if (p<=f[i]) break;if (fastpow(f[i],p-1,p)!=1) return false;ll pp=p-1;while (~pp&1){pp>>=1;ll y=fastpow(f[i],pp,p);if (mul(y,y,p)==1&&y!=1&&y!=p-1) return false;}}return true;
}
ll PR(ll n,ll c){ll i=0,k=2,x,y;x=y=1+rand()%(n-1);while (1){x=(mul(x,x,n)+c)%n;ll d=__gcd((y-x+n)%n,n);if (d!=1&&d!=n) return d;if (x==y) return n;if (++i==k) y=x,k<<=1;}
}
ll tmp[100];int len;
void fact(ll n){if (n==1) return;if (MR(n)) {tmp[++len]=n;return;}ll p=n;for (int c=233;p==n;--c) p=PR(p,c);fact(p);fact(n/p);
}
int Case,q[100],cnt,mod;ll n,k,p[100],ans;
int fpow(int x,ll y){ll res=1;while (y) {if (y&1) res=1ll*res*x%mod;x=1ll*x*x%mod;y>>=1;}return res;
}
int g(ll n){return fpow(k,(n+1)>>1);}
int h(ll n){return (n&1?n:n>>1)%mod;}
void dfs(int i,ll d,int pro){if (i==cnt+1){if ((n/d&1)&&(d&1)==0) return;ans=(ans+1ll*g(n/d)*h(n/d)%mod*pro)%mod;return;}dfs(i+1,d,pro);pro=1ll*pro*(mod+1-p[i]%mod)%mod;for (int j=1;j<=q[i];++j) d*=p[i],dfs(i+1,d,pro);
}
int main(){srand(20020415);scanf("%d",&Case);while (Case--){scanf("%lld%lld%d",&n,&k,&mod);k%=mod;len=cnt=0;fact(n);sort(tmp+1,tmp+len+1);for (int i=1;i<=len;++i){if (tmp[i]!=tmp[i-1]) p[++cnt]=tmp[i],q[cnt]=0;++q[cnt];}ans=0;dfs(1,1,1);printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/zhoushuyu/p/9674590.html


http://www.ppmy.cn/news/176454.html

相关文章

三星 b5330 root (国外转载,经修改整理)

总体步骤说明&#xff1a; just unpack and you have the universal-patch.sh to run over an .tar.md5 firware stock rom. And post-firmwareUpdate.sh to run after you flash in order to make the root a standard android root. 对应文件下载&#xff1a;/Files/moonson/…

luogu P5330 [SNOI2019]数论

传送门 可以枚举一个\(a_i\),然后就是求\(\sum_{x0}^{\lfloor\frac{t-1-a_i}{p}\rfloor}[pxa_i \in B(\mod q)]\) 可以发现所有\(pxa_i\mod q\)的值是成环的,然后可以求出这个环所有前缀中\(\in B\)的元素个数,然后那个式子的值就是完整的环出现次数*环内\(B\)元素个数剩下部分…

BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)

题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id5330 (Luogu) https://www.luogu.org/problem/P4607 题解 首先观察一些性质。 一个回文串可以轮换产生多少个本质不同的串&#xff1f;周期那么多个。 可是有一种特殊情况&#xff0c;就是对于长度为偶数的回…

【JZOJ5330】密码 Kummer Theorem

【JZOJ5330】密码 (File IO): input:password.in output:password.out Time Limits: 1000 ms Memory Limits: 262144 KB Description Input Output Sample Input 4 2 2Sample Output 2Data Constraint Hint 样例解释 解题思路 看到 pk|Csl(p是质数) 这种…

[JZOJ5330]密码

题目大意 给定n,p,k&#xff0c;求 ∑i<j<n[pk|Cji] 其中&#xff0c; n<101000&#xff0c;p<109且p为质数&#xff0c;k<109 分析 首先我们看一个组合数&#xff0c;怎么样才能被 pk 整除呢&#xff1f;我们有 Cnmm!n!(m−n)! &#xff0c;我们可以分别算出…

服务器信息泄漏漏洞,Samba LDAP服务器信息泄露漏洞(CVE-2015-5330)

Samba LDAP服务器信息泄露漏洞(CVE-2015-5330) 发布日期&#xff1a;2015-12-19 更新日期&#xff1a;2016-01-01 受影响系统&#xff1a; Samba Samba 4.x-4.1.22 Samba Samba 4.3.x-4.3.3 Samba Samba 4.2.x-4.2.7 描述&#xff1a; CVE(CAN) ID: CVE-2015-5330 Samba是在Lin…

HDU - 5330 Route Statistics dp(看题解)

HDU - 5330 感觉这种dp和子集和dp差不多&#xff0c; 有点难想到。 dp[ i ][ S ][ j ] 表示最低的 i 位和 S最低的 i 位一样的所有串中&#xff0c; 和 S 的距离为 j 的有多少个。 #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits…

HDU 5330 Route Statistics 【三进制状压DP】

题目来源&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5330 ★如果n小很多&#xff0c;真的可以暴力awa 然而n大了 暴力还是出不了奇迹 这题目前只有两篇题解&#xff0c;而且感觉只有代码&#xff0c;看了好久才看懂&#xff0c;于是我就写了这篇详细一丢丢的题解…

HDU 5330 Route Statistics

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5330 题意&#xff1a;给出n个长度为m&#xff0c;并且只有012组成的串&#xff0c;两个串的距离为每一位相差的绝对值相加&#xff0c;问距离为0-2m的对数分别有几对 参考&#xff1a;http://blog.csdn.net/glqac/…

oki/5330c.html,oki5330scXP驱动怎么安装;打打印机驱动安装

【问题描述】&#xff1a; HPCP1020STRAY.EXE应用程序错误 【原因分析】&#xff1a; 1. 打印机服务异常&#xff1b; 2. 打印机驱动异常。 【简易步骤】&#xff1a; 方案一&#xff1a;【开始】—【运行】—输入【services.msc】回车—找到【Print Spooler】服务—设置设置常…

大步小步法

BSGS 大步小步算法(baby step giant step,BSGS)&#xff0c;是一种用来求解离散对数(即模意义下对数)的算法&#xff0c;即给出 a x ≡ b ( m o d m ) a^{x} \equiv b\pmod{m} ax≡b(modm)中 a , b , m a,b,m a,b,m的值(这里保证a和m互质)&#xff0c;求解x。 实际上&#xf…

conda 克隆

根据已有环境名复制生成新的环境 假设已有环境名为A1&#xff0c;需要生成的环境名为B1&#xff1a; conda create -n B1 --clone A1 根据已有环境路径复制生成新的环境 假设已有环境路径为E:\A1&#xff0c;需要生成的新的环境名为B&#xff1a; conda create -n B1 --clo…

Git Gui工具从远程克隆代码总是提示路径已经存在。问题完美解决!

Git Gui工具从远程克隆代码总是提示路径已经存在。问题完美解决&#xff01; 参考文章&#xff1a; &#xff08;1&#xff09;Git Gui工具从远程克隆代码总是提示路径已经存在。问题完美解决&#xff01; &#xff08;2&#xff09;https://www.cnblogs.com/boqinyaxin/p/10…

conda ❀ 环境克隆

1.安装克隆打包工具 conda install -c conda-forge conda-pack2.克隆为压缩包 conda pack -n 环境名称 -o 环境名称.tar.gz 3.在 C:/用户/当前用户名 中寻找 环境名称.tar.gz 并移到新电脑的 Anaconda3/envs/ 下解压出来【这里已经可以正常使用了】 4.使用克隆的环境创建一…

网站克隆工具webhttrack

安装 命令安装 ┌──(***㉿kali)-[/] └─$ sudo apt-get install webhttrack [sudo] *** 的密码&#xff1a; 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 将会同时安装下列软件&#xff1a;libhttrack2 we…

conda 克隆环境及导入新环境/conda环境移植

1.为了跑代码&#xff0c;环境配置太烦&#xff0c;我需要将服务器的环境克隆下来&#xff0c;在另外一台服务器装&#xff0c;参考网上的方式&#xff0c;出现很多错误&#xff0c;一脸懵逼&#xff0c;后来总结原因&#xff0c;是因为自己源服务器虚拟环境太多了&#xff0c;…

Git 克隆指定分支的代码

原因&#xff1a; 今天拉取 vue-element-admin 遇到这个情况&#xff0c;咋还有这种操作 克隆步骤&#xff1a; 获取你需要的项目的分支名&#xff1a;如 i18n 克隆项目&#xff1a; # 格式&#xff1a;git clone -b <分支名> <URL> git clone -b i18n https://…

AI语音克隆,轻松get

大家好啊&#xff0c;我是小松鼠&#xff0c; 作为白桃小师姐的好友&#xff0c;我一直有一个梦想&#xff0c;就是做一个小世界的鬼畜视频。无奈的是&#xff0c;菜菜的我真的学不会AU和PR&#xff0c;迫不得以暂时放弃了这个梦想。直到前几天&#xff0c;我刷GitHub的时候发…

EBS系统克隆

&#xfeff;&#xfeff; 术语 克隆是对已有的Oracle应用系统创建一份拷贝的过程。克隆一个Oracle应用系统有几种不同的情况&#xff0c;包括&#xff1a; l 标准克隆 – 复制一个已有的Oracle应用系统生成一份拷贝&#xff0c;例如对生产系统进行复制以便测试一些更改。 …

js深度克隆和浅度克隆

“使用JavaScript深度克隆一个对象。” 这是一个出现概率很高的面试题&#xff0c;下面就来总结下&#xff0c;二者的区别以及其代码。 科普一下&#xff1a; js一般有两种不同数据类型的值&#xff1a; 基本类型&#xff08;包括undefined,Null,boolean,String,Number&…
最新文章