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

正题

题目链接: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^41Q5,1LR1010,RL5×104


解题思路

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

G(x)G(x)G(x)表示xxx的联通块数量。首先奇偶数不一样很麻烦,发现如果对于奇数xxxG(x)=G(x−1)+1G(x)=G(x-1)+1G(x)=G(x1)+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。我们让xxx2x%(n+1)2x\%(n+1)2x%(n+1)连边,考虑求出xxx所在环的环长,也就是求一个最小的rrr满足x×2r≡x(modn+1)x\times2^r\equiv x(mod\ \ n+1)x×2rx(mod  n+1),就是满足2r≡1(modn+1gcd(x,n+1))2^r\equiv1(mod\ \ \frac{n+1}{gcd(x,n+1)})2r1(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)=dn,d>1ord(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)2xw1(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)=1ord(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)2b1(mod xy),那么有2b−a≡1(modxy)2^{b-a}\equiv1(mod\ xy)2ba1(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

path hdu6705

题意&#xff1a; 一个有向加权图&#xff0c;问所有路径汇中第k小的路径长度是多少&#xff1f; 注意一个边可以反复走多次 题解 做法参考 我们可以利用优先队列来做 利用优先队列实现每次所取为最短边 我们假设一条路是从u—>v,路径和为sum&#xff0c;u->v是u的所以…

.NET Core实践系列之SSO-跨域实现

前言接着上篇的《.net core实践系列之SSO-同域实现》&#xff0c;这次来聊聊SSO跨域的实现方式。这次虽说是.net core实践&#xff0c;但是核心点使用jquery居多。建议看这篇文章的朋友可以先看上篇《.net core实践系列之SSO-同域实现》做一个SSO大概了解。源码地址&#xff1a…

P2150-[NOI2015]寿司晚宴【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2150 题目大意 将2∼n2\sim n2∼n选出一些分成两个集合&#xff0c;要求这两个集合中没有一对数不是互质的。求方案数对ppp取模 2≤n≤500,1≤p≤10102\leq n\leq 500,1\leq p\leq10^{10}2≤n≤500,1≤p≤1010 解题思路 数…

ABC181——F - Silver Woods

现在时间太少了&#xff0c;只能把自己不会的题补一下&#xff0c;会的题就不写了 F - Silver Woods 显然可以二分圆的半径&#xff0c;那么现在问题转化成判断半径为rrr的圆是否能够满足题意。 考虑什么情况下该半径的圆不能通过这些点。尝试用并查集维护一些关系 如果两个…

【树链剖分】洛谷树(P3401)

正题 P3401 题目大意 给你一棵树&#xff0c;让你进行以下操作 修改一条边的边权查询一条路径的所有子路径异或值的和 解题思路 记下所有点到根节点的路径亦或值&#xff0c;那么查询就是所有点对的异或值之和 因为边权<1024&#xff0c;最多只有10位&#xff0c;所以可…

牛客练习赛70 重新排列

来源&#xff1a;牛客网&#xff1a; 文章目录重新排列题解&#xff1a;代码&#xff1a;重新排列 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 牛牛有个很喜欢的字符串”…

.NET 源代码库指南

微软.NET开发团队在博客上&#xff08;https://blogs.msdn.microsoft.com/dotnet/2018/10/15/guidance-for-library-authors/&#xff09;发布了.NET Library Guidance的第一个版本。这是一系列全新的文章&#xff0c;指导你为.NET创建高质量代码库。该指南包含我们已确定的适用…

P4774-[NOI2018]屠龙勇士【EXCRT】

正题 题目链接:https://www.luogu.com.cn/problem/P4774 题目大意 nnn个龙血量为aia_iai​&#xff0c;回复能力为pip_ipi​&#xff0c;死亡后掉落剑的攻击力tit_iti​&#xff0c;mmm把剑&#xff0c;攻击力为bib_ibi​。 从111开始打&#xff0c;每次使用不大于当前龙血量…

ARC107——D - Number of Multisets

D - Number of Multisets 之前写过一个类似表示的题&#xff08;2018CCPC吉林赛区——C - Justice&#xff09;&#xff0c;也是让用12,14,18…\frac1 2 ,\frac 14,\frac1 8 \dots21​,41​,81​…凑数&#xff0c;我效仿之前的思路写了个复杂度不清楚的东西&#xff08;非常爆…

【树链剖分】春季大扫除(P6805)

正题 P6805 题目大意 给你一棵树&#xff0c;每次可选择两个叶子结点&#xff0c;然后覆盖路径上的边&#xff0c;代价为其长度&#xff0c;每个叶子结点只能选一次。 对于每次询问&#xff0c;加入若干新点&#xff08;只会连接原树的点&#xff09;&#xff0c;问你覆盖所…

序列自动机

介绍 子串&#xff1a;串中任意个连续的字符组成的子序列称为该串的子串 子序列&#xff1a;子序列中的字符在字符串中不一定是连在一起的&#xff0c;而是删除其中若干个&#xff0c; 但子序列一定是单调的 简单说就是子序列不连续&#xff0c;子串连续 序列自动机可以在复杂…

基于gRPC服务发现与服务治理的方案

重温最少化集群搭建&#xff0c;我相信很多朋友都已经搭建出来&#xff0c;基于Watch机制也实现了出来&#xff0c;相信也有很多朋友有了自己的实现思路&#xff0c;但是&#xff0c;很多朋友有个疑问&#xff0c;我API和服务分离好了&#xff0c;怎么通过服务中心进行发现呢&a…

YbtOJ#723-欧拉之树【莫比乌斯反演,虚树】

正题 题目链接:http://www.ybtoj.com.cn/contest/121/problem/2 题目大意 给出nnn个点的一棵树&#xff0c;每个点有一个权值aia_iai​&#xff0c;求 ∑i1n∑j1ndis(i,j)φ(aiaj)\sum_{i1}^n\sum_{j1}^ndis(i,j)\times \varphi(a_i\times a_j)i1∑n​j1∑n​dis(i,j)φ(ai​…

拼凑 牛客练习赛70

来源&#xff1a;牛客网&#xff1a; 题目描述 牛牛还是很喜欢字符串"puleyaknoi"。 牛牛有T个超长超长的字符串&#xff0c;不过这次他更懒了&#xff0c;他希望直接在字符串中看见他喜欢的字符串。 如果一个子串中含有一个子序列是”puleyaknoi“&#xff0c;那么…

【kruskal】【倍增】严格次小生成树(P4180)

正题 P4180 题目大意 求严格次小生成树 解题思路 一定存在一种严格次小生成树&#xff0c;和最小生成树只差一条边&#xff0c;不然可以用一条最小生成树上的边代替&#xff0c;从而使边权和更小 那么可以先构造出最小生成树&#xff0c;然后枚举每一条不在最小生成树中的边…

ARC107——C - Shuffle Permutation

C - Shuffle Permutation 这几天遇到了很多&#xff08;2道&#xff09;并查集维护连通关系的题。 此题把能够相互交换的行或者列用并查集维护&#xff0c;不难发现一个连通块内的点个数时cntcntcnt连通块内的行或者列可以两两交换&#xff0c;那么对答案的贡献是cnt!cnt!cnt…

CentOS ASP.NET Core Runtime Jexus跨平台布署

.net core 开源和跨平台&#xff0c;能布署到当前主流的Windows&#xff0c;Linux&#xff0c;macOS 系统上。本篇我们将在 Linux 系统上使用 ASP.NET Core Runtime 和 Jexus 布署运行 ASP.NET Core 网站。Linux 系统选的是 CentOS 7.4 64位.NET Core 安装的是 ASP.NET Core Ru…

P1912-[NOI2009]诗人小G【四边形不等式,单调队列】

正题 题目链接:https://www.luogu.com.cn/problem/P1912 题目大意 给出nnn个字符串&#xff0c;把这些字符串依次用空格&#xff08;算一个长度&#xff09;连接分成若干段&#xff0c;若一段长度为xxx&#xff0c;那么代价是∣x−L∣P|x-L|^P∣x−L∣P 求代价和最小的方案&…

疾病预测和天气分析练习赛

肝了半天再加一个晚上。。 之前学了一小段时间的TensorFlow&#xff0c;但是今天练习赛时发现根本没啥用。。。第一阶段早就做完了&#xff0c;今天做的都是第二阶段&#xff0c;都是啥玩意题 又是偏度&#xff0c;又是求系数&#xff0c;又是拟合KNN&#xff0c;真的把人看吐…

Korney Korneevich and XOR(CF750F1/F2)

正题 CF750F1 CF750F2 题目大意 给你一个数列&#xff0c;问有多少个数可以由一个单调递增的子序列异或得到 解题思路 对于F1&#xff0c;可以用p存下得到一个数的最小值&#xff08;即当前子序列前缀的最后一个数&#xff09;&#xff0c;然后直接暴力转移 对于F2&#xf…