9.29模拟赛

T1:

【数据范围】

40%的数据满足 A<=105

另有30%的数据满足N,M<=109 ;|S|,|T|<=10(|S|表示S的长度);

100%的数据满足 N,M<=109 ;|S|,|T|<=106

先求循环节内,即lcm(S,T)内,匹配数出现次数。

然后乘上循环次数即可。

就是S,T内对d=gcd(S,T)同余的位置的相等字符对数的数量。

可以证明.

证明:

设S长度为l1,T长度为l2

如果一个S中位置a的字符和T中位置b的字符相同。

如果可以在循环节内匹配上的话。

那么满足存在k1,k2:a+k1*l1=b+k2*l2

我们现在要找,k1,k2是否存在,有几个。

移项:k1*l1-k2*l2=b-a;

有解条件是:d=gcd(l1,l2)|(b-a),否则k1,k2不存在

(b-a的正负对解的有无无关紧要,假设是正数)

假设有解,设x=(b-a)/d;

那么,同时除以d,可以有:k1*l1‘-k2*l2‘=x;

其中,l1‘,l2‘互质。

那么就有,k1*l1‘=x+k2*l2‘

有:k1*l1‘=x mod (l2‘)

并且,由于x小于l2‘,所以,如果存在一个非负整数k1,符合方程,那么一定有一个唯一的非负整数的k2

所以等价于同余方程k1*l1‘=x mod (l2‘)的k1有几个非负整数解。

由于l1‘,l2‘互质,所以,存在一个小于l2‘的k1=x*l1‘^(-1) mod (l2‘)

那么,这个k1能否加上若干倍的l2‘呢?

发现,

其实现在k1有了一个条件

因为现在是在循环节的内部,而0<=a<l1;

而lcm=l2‘*l1

所以,0<=k1<l2‘,否则就超出了lcm

由于l1‘,l2‘互质,所以,存在一个k1=x*l1‘^(-1) mod (l2‘)

而k1不能大于等于l2‘,所以,这个k1有且只有一个。

现在我们证明了,

在d=gcd(l1,l2)|(b-a)时,在循环节内有且只有一次a,b匹配的机会。

所以,我们可以枚举字符char∈a~z

把字符都是char的两个位置 b,a关于d的余数分类。

余数相同的ai,bi位置一定会匹配一次。因为做差一定是d的倍数。

所以,我们可以每次扫两遍S,T把char出现的位置记录下来。

然后一个同余类个数直接相乘即可。

最后,再乘上循环节循环次数。

代码:

原文地址:https://www.cnblogs.com/Miracevin/p/9726275.html

时间: 2024-10-18 08:10:07

9.29模拟赛的相关文章

2104.10.29模拟赛【奶牛编号】

2.奶牛编号 [问题描述] 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛.      然而,他有点迷信,标识奶牛用的二进制数字,必须只含有K位“1” (1 <= K <= 10). 当然,每个标识数字的首位必须为“1”.      FJ按递增的顺序,安排标识数字,开始是最小可行的标识数字 (由“1”组成的一个K位数).      不幸的是,他没有记录下标识数字.请帮他计算,第N个标识数字 (1 <= N <= 10^7). [输入] 第1行:空格隔开的两

2017/9/29模拟赛

T1.多米诺骨牌(card)小 Z 最近买了很多很多的多米诺骨牌,他选出了其中的一些排成了一排,并且准备从右到左碰倒这些骨牌.每个骨牌有一个坐标 xi(>=1)和一个大小 yi(>=1),倒下时将会碰倒坐标区间位于[xi-yi,xi)内的所有骨牌.当然没有两个骨牌有相同的坐标, 并且小 Z 规定坐标大的更靠右.但是他发现他买的骨牌太巨了,所以在倒下的时候会将所有碰倒的骨牌破坏掉,被破坏掉的骨牌就无法使用了,并且不会倒下.得知这个消息的小 Z 十分惊讶,他想知道如果还按刚才这种方法从右到左碰倒所

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

bzoj2741: 【FOTILE模拟赛】L

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2679  Solved: 766[Submit][Status][Discuss] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一

140725模拟赛总结

A:hdu4847    字符串匹配第一想法是KMP,写了好长时间结果还TLE了-_-||,实际上用个简单的枚举判断就能解决.因为待验证的字符串"doge"很小.写A题的时候还被输入卡了半天.Tips1:输入至文件结尾(eof)的常用方法:     while (cin>>a)        //最常用的     while (cin.getline(s,30))    //按行读入前30个字符.空格也读入    getline(cin,s)        //和getli