正题

题目链接:http://www.ybtoj.com.cn/problem/912


题目大意

给出\(L,R\),求有多少长度在\([L,R]\)之间的字符串满足依次取出所有偶数位置的放在最前面后,与原字符串相同。字符集是所有小写字母。

\(1\leq Q\leq 5,1\leq L\leq R\leq 10^{10},R-L\leq 5\times 10^4\)


解题思路

这个东西可以理解为给出一些相等关系的边,然后求联通块的数量\(G\),然后方案就是\(26^G\)。

设\(G(x)\)表示\(x\)的联通块数量。首先奇偶数不一样很麻烦,发现如果对于奇数\(x\)有\(G(x)=G(x-1)+1\)(最后一个自己连自己)。所以我们只需要考虑偶数的。

\(n\)为偶数时给出的条件其实就是\(S_i=S_{2i\%(n+1)}\),然后此时考虑点\(x\),有\(d=gcd(x,n+1)\),那么有\(x=dk\)。我们让\(x\)向\(2x\%(n+1)\)连边,考虑求出\(x\)所在环的环长,也就是求一个最小的\(r\)满足\(x\times2^r\equiv x(mod\ \ n+1)\),就是满足\(2^r\equiv1(mod\ \ \frac{n+1}{gcd(x,n+1)})\),后文记做\(ord(\frac{n+1}{gcd(x,n+1)})\)。然后满足\(gcd(x,n+1)=d\)的都在一些大小为\(r\)的环中相互连接,这样的\(x\)有\(\varphi(\frac{n+1}{gcd(x,n+1)})\)个。所以这样的环有\(\frac{\varphi(\frac{n+1}{gcd(x,n+1)})}{ord(\frac{n+1}{gcd(x,n+1)})}\),然后改成枚举\(\frac{n+1}{gcd(x,n+1)}\)就有一个比较舒服的式子

\[G(n)=\sum_{d|n,d>1}\frac{\varphi(d)}{ord(d)}
\]

上面那个\(\varphi\)很好求,考虑怎么求下面那个\(ord\)。

和原根类似的使用试除法,首先根据欧拉定理肯定有\(ord(n)|\varphi(n)\)。然后考虑对于\(\varphi(n)\)的每个约数\(x\)如果满足\(2^{\frac wx}\equiv 1(mod\ \ n)\)就代表可以除去这个\(x\)。

但是这样每次来搞还是很慢,这里还有一个挺显然的结论

\[gcd(x,y)=1\Rightarrow ord(x\times y)=lcm(\ ord(x),ord(y)\ )
\]

证明的话首先定理\(a=lcm(x,y)\),再设一个\(2^b\equiv 1(mod\ xy)\),那么有\(2^{b-a}\equiv1(mod\ xy)\),然后这样更相减损下去最后就有\(2^{gcd(a,b)}\equiv 1(mod\ xy)\),所以如果\(b<a\)那么有,然后因为\(a=lcm(x,y)\)也就是这个就是新的最小的\(gcd\)。

所以我们就只需要求出所有需要的\(ord(p^k)\)就好了。

然后我们可以先枚举\(\sqrt R\)以内的质数然后来给所有\([L,R]\)中的数质因数分解,然后对于里面的每个\(x\)用搜索来求所有的约数。


code

  1. #pragma GCC optimize(2)
  2. %:pragma GCC optimize(3)
  3. %:pragma GCC optimize("Ofast")
  4. %:pragma GCC optimize("inline")
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<algorithm>
  8. #include<map>
  9. #include<vector>
  10. #include<cctype>
  11. #define ll __int128
  12. using namespace std;
  13. const ll N=1e5+10,P=1e9+7;
  14. ll q,L,R,ans,tot,cnt,G;
  15. ll pri[N],phi[N],mk[N][35],p[35],c[35];
  16. bool v[N];vector<ll >cp[N];
  17. map<ll,map<ll,ll> >mp;
  18. ll read() {
  19. ll x=0,f=1; char c=getchar();
  20. while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
  21. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  22. return x*f;
  23. }
  24. void print(ll x){
  25. if (x>9) print(x/10); putchar(x%10+48); return;
  26. }
  27. ll power(ll x,ll b,ll P){
  28. ll ans=1;
  29. while(b){
  30. if(b&1)ans=ans*x%P;
  31. x=x*x%P;b>>=1;
  32. }
  33. return ans;
  34. }
  35. ll ord(ll p,ll k){
  36. if(p<N&&mk[p][k])return mk[p][k];
  37. if(p>pri[cnt]&&mp[p][k])return mp[p][k];
  38. ll m=power(p,k,1e18),x,w=p-1;x=m/p*(p-1);
  39. while(x%p==0){
  40. ll z=power(2,x/p,m);
  41. if(z!=1)break;x/=p;
  42. }
  43. if(w>=L&&w<=R+2){
  44. ll wz=w-L;
  45. for(ll wc=0;wc<cp[wz].size();wc++){
  46. ll i=cp[wz][wc];
  47. while(x%pri[i]==0){
  48. ll z=power(2,x/pri[i],m);
  49. if(z!=1)break;x/=pri[i];
  50. }
  51. while(w%pri[i]==0)w/=pri[i];
  52. }
  53. }
  54. else{
  55. for(ll i=1;pri[i]*pri[i]<=w&&i<=cnt;i++){
  56. if(w%pri[i])continue;
  57. while(x%pri[i]==0){
  58. ll z=power(2,x/pri[i],m);
  59. if(z!=1)break;x/=pri[i];
  60. }
  61. while(w%pri[i]==0)w/=pri[i];
  62. }
  63. }
  64. if(w>1){
  65. if(x%w==0){
  66. ll z=power(2,x/w,m);
  67. if(z==1)x/=w;
  68. }
  69. }
  70. if(p<N)mk[p][k]=x;
  71. else mp[p][k]=x;
  72. return x;
  73. }
  74. void prime(){
  75. phi[1]=1;
  76. for(ll i=2;i<N;i++){
  77. if(!v[i])pri[++cnt]=i;
  78. for(ll j=1;j<=cnt&&i*pri[j]<N;j++){
  79. v[i*pri[j]]=1;
  80. if(i%pri[j]==0)break;
  81. }
  82. }
  83. return;
  84. }
  85. ll lcm(ll x,ll y){
  86. ll d=__gcd(x,y);
  87. return x*y/d;
  88. }
  89. void dfs(ll x,ll ph,ll od){
  90. if(x>tot){G+=ph/od;return;}
  91. dfs(x+1,ph,od);
  92. for(ll i=1,w=p[x];i<=c[x];i++)
  93. dfs(x+1,ph*(w/p[x]*(p[x]-1)),lcm(od,ord(p[x],i))),w=w*p[x];
  94. return;
  95. }
  96. ll work(ll n){
  97. tot=0;ll wz=n-L;
  98. for(ll w=0;w<cp[wz].size();w++){
  99. ll i=cp[wz][w];
  100. p[++tot]=pri[i];c[tot]=0;
  101. while(n%pri[i]==0)
  102. c[tot]++,n/=pri[i];
  103. }
  104. if(n>1)p[++tot]=n,c[tot]=1;
  105. G=-1;dfs(1,1,1);
  106. return G;
  107. }
  108. signed main()
  109. {
  110. // freopen("language.in","r",stdin);
  111. // freopen("language.out","w",stdout);
  112. // scanf("%lld",&q);
  113. q=read();prime();
  114. while(q--){
  115. // scanf("%lld%lld",&L,&R);
  116. L=read();R=read();ans=0;
  117. for(ll i=0;i<=R-L+2;i++)cp[i].clear();
  118. for(ll i=1;i<=cnt;i++){
  119. ll x=pri[i],l=L/x,r=(R+2)/x;
  120. for(ll j=l;j<=r;j++){
  121. if(j*x<L||j*x>R+2)continue;
  122. cp[j*x-L].push_back(i);
  123. }
  124. }
  125. for(ll i=L/2;i<=R/2;i++){
  126. ll tmp=work(i*2ll+1);
  127. if(i*2ll>=L)ans=(ans+power(26,tmp,P))%P;
  128. if(i*2ll+1<=R)ans=(ans+power(26,tmp+1,P))%P;
  129. }
  130. print(ans);putchar('\n');
  131. // printf("%lld\n",ans);
  132. }
  133. return 0;
  134. }

YbtOJ#912-神秘语言【结论,欧拉定理】的更多相关文章

  1. 作为非计算机专业的学生,觉得 C 语言远比其他语言易于上手,正常吗?

    作者:invalid s链接:https://www.zhihu.com/question/26659552/answer/615531516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

  2. [arc081F]Flip and Rectangles-[黑白染色]

    Description 传送门 Solution 有一个神秘的结论..我不知道大佬是怎么场上推出来的. 一个黑白染色图,每次可以任意翻转行或列的颜色,如果每个2*2的子矩阵内黑色格子都是偶数个,则可以 ...

  3. 【FCS NOI2018】福建省冬摸鱼笔记 day3

    第三天. 计算几何,讲师:叶芃(péng). dalao们日常不记笔记.@ghostfly233说他都知道了,就盼着自适应辛普森积分. 我计算几何基础不好……然而还是没怎么讲实现,感觉没听什么东西进去 ...

  4. 04C++核心编程

    Day01 笔记 1 C++概述 1.1 C++两大编程思想 1.1.1 面向对象 1.1.2 泛型编程 1.2 移植性和标准 1.2.1 ANSI 在1998制定出C++第一套标准 2 c++初识 ...

  5. C语言的污垢,一个能污染内存的神秘操作!神级坑位再现~

    本文目的是为了更好的理解指针和内存管理 背景 我们定义一个变量A,修改另外一个一个变量B,导致A的值被修改,我们称它为内存污染. 案例 如下程序,正常的预期输出应该是:97 98 256 ,但正确的结 ...

  6. YbtOJ#893-带权的图【高斯消元,结论】

    正题 题目链接:https://www.ybtoj.com.cn/problem/893 题目大意 给出一张\(n\)个点\(m\)条边的无向联通图,每条边正反向各有\(A,B,C\)三种边权. 保证 ...

  7. 如何设计一门语言(十)——正则表达式与领域特定语言(DSL)

    几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一 ...

  8. C语言内存调试技巧—C语言最大难点揭秘

    本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序, ...

  9. C# 动态语言特性,dynamic 关键字研究

    1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...

随机推荐

  1. explorer.exe

    explorer.exe是Windows程序管理器或者文件资源管理器, 它用于管理Windows图形壳,包括桌面和文件管理,删除该程序会导致Windows图形界面无法使用. 终止: taskkill ...

  2. qt work

    auto folder1="./.mm"; QDir *folder = new QDir; bool exist = folder->exists(folder1); if ...

  3. 网络视频m3u8解密及ts文件合并

    网络视频m3u8解密及ts文件合并 参考了两篇博客: https://blog.csdn.net/weixin_41624645/article/details/95939510 https://bl ...

  4. 关于struts中Ognl和iterator配合再次理解

    Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...

  5. git tag的用法及意义

    git tag 介绍 命令是用来给当前项目状态(在某次commit后)打标签的,目的是便于以后将项目状态回滚到当时打标签的状态.可以把它与虚拟机的snapshot(快照)进行类比. 回想当时在看< ...

  6. vue组件里不用的css还在搜索过滤来删除?试一下vue-clearcss吧!

    这篇文章其实是推广介绍我个人的npm工具库,但你不会后悔点进来的(应该吧...)vue-clearcss 为什么要用它? 一个vue文件在长期迭代中css会越来越冗余,它不像html和js那么好删除, ...

  7. Java全栈方向学习路线

    前端方向 前端基础 HTML --> https://www.w3school.com.cn/html/index.asp CSS --> https://www.w3school.com ...

  8. VMware ESXi 7.0 U2 SLIC & Unlocker USB 网卡驱动集成镜像 202109更新

    2021.08.31 更新:集成 "vmkusb-nic-fling"."net-community" 和 "nvme-community" ...

  9. EternalBlue永恒之蓝渗透测试

    Eternal Blue(永恒之蓝)-ms17-010渗透测试 第一次做的渗透测试,也是第一次去写博客,还望各位师傅多多指正 :) 工具 1.靶机系统 window7 开放445以及139端口 2.k ...

  10. RHCS集群架构之mysql及共享存储iscsi

    server1 172.25.7.1(配置Nginx.ricci和luci) server2 172.25.7.2(Apache.iscsi) server3 172.25.7.3(Apache) s ...