正题

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


题目大意

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

1≤Q≤5,1≤L≤R≤1010,R−L≤5×1041\leq Q\leq 5,1\leq L\leq R\leq 10^{10},R-L\leq 5\times 10^41≤Q≤5,1≤L≤R≤1010,R−L≤5×104


解题思路

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

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

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

上面那个φ\varphiφ很好求,考虑怎么求下面那个ordordord。
和原根类似的使用试除法,首先根据欧拉定理肯定有ord(n)∣φ(n)ord(n)|\varphi(n)ord(n)∣φ(n)。然后考虑对于φ(n)\varphi(n)φ(n)的每个约数xxx如果满足2wx≡1(modn)2^{\frac wx}\equiv 1(mod\ \ n)2xw​≡1(mod  n)就代表可以除去这个xxx。

但是这样每次来搞还是很慢,这里还有一个挺显然的结论
gcd(x,y)=1⇒ord(x×y)=lcm(ord(x),ord(y))gcd(x,y)=1\Rightarrow ord(x\times y)=lcm(\ ord(x),ord(y)\ )gcd(x,y)=1⇒ord(x×y)=lcm( ord(x),ord(y) )
证明的话首先定理a=lcm(x,y)a=lcm(x,y)a=lcm(x,y),再设一个2b≡1(modxy)2^b\equiv 1(mod\ xy)2b≡1(mod xy),那么有2b−a≡1(modxy)2^{b-a}\equiv1(mod\ xy)2b−a≡1(mod xy),然后这样更相减损下去最后就有2gcd(a,b)≡1(modxy)2^{gcd(a,b)}\equiv 1(mod\ xy)2gcd(a,b)≡1(mod xy),所以如果b<ab<ab<a那么有,然后因为a=lcm(x,y)a=lcm(x,y)a=lcm(x,y)也就是这个就是新的最小的gcdgcdgcd。

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

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


code

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cctype>
#define ll __int128
using namespace std;
const ll N=1e5+10,P=1e9+7;
ll q,L,R,ans,tot,cnt,G;
ll pri[N],phi[N],mk[N][35],p[35],c[35];
bool v[N];vector<ll >cp[N];
map<ll,map<ll,ll> >mp;
ll read() {ll x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
void print(ll x){if (x>9) print(x/10); putchar(x%10+48); return;
}
ll power(ll x,ll b,ll P){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll ord(ll p,ll k){if(p<N&&mk[p][k])return mk[p][k];if(p>pri[cnt]&&mp[p][k])return mp[p][k];ll m=power(p,k,1e18),x,w=p-1;x=m/p*(p-1); while(x%p==0){ll z=power(2,x/p,m);if(z!=1)break;x/=p;}if(w>=L&&w<=R+2){ll wz=w-L;for(ll wc=0;wc<cp[wz].size();wc++){ll i=cp[wz][wc];while(x%pri[i]==0){ll z=power(2,x/pri[i],m);if(z!=1)break;x/=pri[i];}while(w%pri[i]==0)w/=pri[i];} }else{for(ll i=1;pri[i]*pri[i]<=w&&i<=cnt;i++){if(w%pri[i])continue;while(x%pri[i]==0){ll z=power(2,x/pri[i],m);if(z!=1)break;x/=pri[i];}while(w%pri[i]==0)w/=pri[i];}}if(w>1){if(x%w==0){ll z=power(2,x/w,m);if(z==1)x/=w;}}if(p<N)mk[p][k]=x;else mp[p][k]=x;return x;
}
void prime(){phi[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;}}return;
}
ll lcm(ll x,ll y){ll d=__gcd(x,y);return x*y/d;
}
void dfs(ll x,ll ph,ll od){if(x>tot){G+=ph/od;return;}dfs(x+1,ph,od);for(ll i=1,w=p[x];i<=c[x];i++)dfs(x+1,ph*(w/p[x]*(p[x]-1)),lcm(od,ord(p[x],i))),w=w*p[x];return;
}
ll work(ll n){tot=0;ll wz=n-L;for(ll w=0;w<cp[wz].size();w++){ll i=cp[wz][w];p[++tot]=pri[i];c[tot]=0;while(n%pri[i]==0)c[tot]++,n/=pri[i];}if(n>1)p[++tot]=n,c[tot]=1;G=-1;dfs(1,1,1);return G;
}
signed main()
{//  freopen("language.in","r",stdin);
//  freopen("language.out","w",stdout);
//  scanf("%lld",&q);q=read();prime();while(q--){//      scanf("%lld%lld",&L,&R);L=read();R=read();ans=0;for(ll i=0;i<=R-L+2;i++)cp[i].clear();for(ll i=1;i<=cnt;i++){ll x=pri[i],l=L/x,r=(R+2)/x;for(ll j=l;j<=r;j++){if(j*x<L||j*x>R+2)continue;cp[j*x-L].push_back(i);}}for(ll i=L/2;i<=R/2;i++){ll tmp=work(i*2ll+1);if(i*2ll>=L)ans=(ans+power(26,tmp,P))%P;if(i*2ll+1<=R)ans=(ans+power(26,tmp+1,P))%P;}print(ans);putchar('\n');
//      printf("%lld\n",ans);}return 0;
}

YbtOJ#912-神秘语言【结论,欧拉定理】相关推荐

  1. 用c语言验证欧拉定理,欧拉定理_欧拉定理的意义

    欧拉定理 在数学及许多分支中都可以见到很多以欧拉命名的常数.公式和定理.在数论中,欧拉定理(Euler Theorem,也称费马-欧拉定理或欧拉函数定理)是一个关于同余的性质.欧拉定理得名于瑞士数学家 ...

  2. e语言做爱奇艺视频采集_现有的15种奇异(和疯狂)编程语言

    有人说学习编程很困难 ,乏味且令人生厌. 这就像学习一种新语言一样 ,只是要与一台机器对话,而该机器需要通过非常特定的命令来告诉他们做什么和执行什么. 由于某种原因,一群人似乎认为编程本身还不够复杂, ...

  3. Segment 2:Introduction Number Theory——Fermat and Euler【费马定理和欧拉定理】

    Segment 2:Introduction Number Theory--Fermat and Euler[费马定理和欧拉定理] 这是整个数论简介的内容,下面是这个的主目录,其链接为:https:/ ...

  4. JavaScript 王者归来

    JavaScript 王者归来 作者:月影 清华大学出版社 第一部分 概论 第一章 从零开始 程序设计之道无远弗届,御晨风而返 --杰弗瑞.詹姆士 在人类漫漫的历史长河里,很难找到第二个由简单逻辑和抽 ...

  5. 计算机学院的行话,只有你和你同学知道的“专业行话”

    原标题:只有你和你同学知道的"专业行话" 欢迎来到小工君的世界 每个专业里都流传着一种神秘语言 隔行隔座山 小工君来为大家介绍一下 工学院的各专业行话吧! 1 波特率 学计算机的同 ...

  6. Lisp 是怎么成为上帝的编程语言的

    开发四年只会写业务代码,分布式高并发都不会还做程序员? >>>   本文来自:Linux 中国 LCTT https://linux.cn/article-10255-1.html  ...

  7. 袁春风老师:计算机系统基础(一) 第一章

    南京大学 计算机系统基础(一)主讲:袁春风老师 基础好的读目录回顾一下即可 本课程是以csapp为教材进行讲解的 程序执行结果,不仅取决于算法.程序编写.编程语言的语法语义 ,而且取决于语言处理系统. ...

  8. 计算机组织简介(Computer Organization)

    计算机组织简介(Computer Organization) 作者:弘树 尊重原创版权,未经许可禁止转载 本文遵循 中国学馆联盟Html-Markdown标准 计算机只是执行程序的机器.那么,什么是程 ...

  9. 凡人无法打开的文件3

    说了这么久那么到底什么是Python?Python的由来?与Python如何下载? #在说Python之前先回顾一下啊,咱们人类控制电脑的操作光是手指敲敲拼音,电脑就听听话话的帮助'人类主人'做想做的 ...

最新文章

  1. 《Pro ASP.NET MVC 3 Framework》学习笔记之九【Ninject的使用-下】
  2. python 跟踪算法
  3. python简单代码画图-Python科学画图代码分享
  4. [Groovy] Groovy API
  5. Android开发实例之多点触控程序
  6. 卷积神经网络 手势识别_如何构建识别手语手势的卷积神经网络
  7. ASP.NET中的AJAX应用开发详解
  8. python下载图片到文件夹_请教大佬:下载图片,运行后文件夹创立了,但里边没有图,为什么...
  9. kafka 控制台命令
  10. runtime之ivar内存布局篇
  11. 飞机大战(Java)
  12. Vue导出Excel表格信息
  13. visual studio 显示行号
  14. html中的if函数,IF函数的使用方法
  15. java lazy实现依赖调用_spring 之 lazy-init Autowired depends-on
  16. HTML+CSS学习——奥运五环代码
  17. 二次元高清无水印壁纸
  18. PicPick的安装方法
  19. C#-串口-模拟量采集软件-1
  20. csr8675 设置tws_tws 004如何将nodejs配置为使用端口443

热门文章

  1. sql两个列值以下划线拼接得到一个新的列_面试必备sql知识点——MySQL基础
  2. 项目经理问我Java内存区域模型!急急急
  3. io python 读取pdf_Python读取PDF文件--pdfminer
  4. linux命令查询邮件发送状态,Linux发邮件之mail命令详解
  5. @scheduled注解配置时间_SpringBoot2.0实战(32)配置定时任务
  6. 傅里叶变换音频可视化_HTML5如何实现音频可视化频谱跳动
  7. gesturedetector.java_android使用gesturedetector手势识别示例分享
  8. matlab仿真习题,(MATlab仿真部分习题答案.doc
  9. [Java]Java中的i++不是原子操作
  10. 异步清零和同步置数/清零的区别