2018牛客网暑假ACM多校训练赛(第四场)A Ternary String 数论
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-A.html
题目传送门 - https://www.nowcoder.com/acm/contest/142/A
题意
给定一个长度为 $n$ ,只包含 $0,1,2$ 的数列。
每一秒会依次进行如下操作:
1. 所有的 $1$ 后面生出一个 $0$
2. 所有的 $2$ 后面生出一个 $1$
3. 第一个数字消失了
问经过多少时间之后,数列全部消失。
多组数据。
答案对于 $10^9+7$ 取模。 $n\leq 10^5,\sum n\leq 2\times 10^6$
题解
假设当前时间为 $t$ ,我们可以简单推一波式子分别得到消灭下一个数字及其生出来的数字之后的时间:
如果下一个数字是 :则
0 : $t^\prime=t+1$
1 : $t^\prime=2t+2$
2 : $t^\prime=6\times 2^t-3$
那么由于 $t$ 会出现在指数上面,我们不能随意将 $t$ 对 $10^9+7$ 取模。
我当场写了个 $O(n\log n)$ 的,一个有点低级的错误续了我很久(看来昨天念诗之后还有后遗症啊)
考虑欧拉定理:
当 $\gcd(a,b)=1$ 时,$a^{\phi (b)}\equiv 1 \pmod b$ 。
由于这里 $a=2$ ,所以我们可以进行推广。
记 $b=x\times 2^y,a=2^{k+y}$ ,则当 $k\geq 0$ 时 :
$$2^{k+y}\equiv 2^{(k \mod {\phi(x)}) + y}\pmod {x\times 2^y}$$
于是我们可以使 $k$ 取模。
但是如果 $k<0$ 呢,那么显然这个数字很小,直接算出来。
注意一下 $y$ 的值也是很小的。
我们处理一下前面较小的一部分的答案,然后从后往前根据上式递归求解即可。
时间复杂度 $O(n\log n)$ 。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
int T,ps[N],x[N],y[N],px[N],pt[N];
char s[N];
int Pow(int x,int y,int mod){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int phi(int x){
int ans=x;
for (int i=2;i*i<=x;i++){
if (x%i==0){
ans=ans/i*(i-1);
while (x%i==0)
x/=i;
}
}
if (x>1)
ans=ans/x*(x-1);
return ans;
}
int solve(int j,int k){
if (j==0||pt[j]>0)
return pt[j];
int i=j;
while (i>0&&s[i]!='2')
i--;
int t=i==0?0:((6LL*Pow(2,solve(i-1,k+1),x[k])-3)%x[k]);
for (int p=i+1;p<=j;p++){
if (s[p]=='0')
t=(t+1)%x[k];
if (s[p]=='1')
t=(2*t+2)%x[k];
}
t=((t-y[k])%x[k]+x[k])%x[k];
return t+y[k];
}
int main(){
ps[0]=1e9+7;
for (int i=1;i<=100000;i++)
ps[i]=phi(ps[i-1]);
for (int i=1;i<=100000;i++){
for (x[i]=ps[i-1],y[i]=0;x[i]%2==0;x[i]>>=1,y[i]++);
x[i]=phi(x[i]);
}
x[0]=ps[0],y[0]=0;
scanf("%d",&T);
while (T--){
scanf("%s",s+1);
int n=strlen(s+1),i=0;
for (int x=0;i<n;i++,pt[i]=x){
if (s[i+1]=='0')
x++;
if (s[i+1]=='1')
x=x*2+2;
if (s[i+1]=='2')
x=6*Pow(2,x,1e9+7)-3;
if (x>=21)
break;
}
printf("%d\n",(solve(n,0))%ps[0]);
for (;i>0;i--)
pt[i]=0;
}
return 0;
}
2018牛客网暑假ACM多校训练赛(第四场)A Ternary String 数论的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...
随机推荐
- Mysql 一些基本的小东西
mysql的安装 1.解压目录 2.添加环境变量 系统的环境变量 3.初始化 mysqld --initialize-insecure 4.启动服务端 mysqld 直接启动 这个时候 吼住 5.连接 ...
- Socket实现断线重连
客户端维护一个线程安全的待发送信息队列 开启死循环 判断Socket = null 调用Socket的sendUrgentData(0xFF)发送1个字节的心跳包 捕捉到连接异常后就关 ...
- C语言-社保工资查询系统
一.简述 此次程序没有涉及函数,完成工资.保险和住房公积金税前税后的查询.工资和社保公积金算法是依据最新的北京标准计算. 五险一金标准: 税率: 1.输入编号1~6查询保险,然后再选择是依据税前工资还 ...
- spring中BeanFactory和FactoryBean的区别
共同点: 都是接口 区别: BeanFactory 以Factory结尾,表示它是一个工厂类,用于管理Bean的一个工厂 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器 ...
- mysql针对单个库进行备份
#!/bin/bashBakDir=/backup/mysql_backupLogFile=/backup/mysql_backup.logDate=`date +%Y%m%d`Begin=`date ...
- python介绍、解释器、变量及其它
python 一.python及编程语言介绍 编程语言发展:机器语言==>汇编语言==>高级语言 机器语言:由数字电路发展而来编程都是靠0101的二进制进行 汇编语言:汇编语言的实质和机器 ...
- Java希尔排序算法
希尔排序就是对直接插入排序的一个优化.比如有这么一种情况:对一个无序数组进行从小到大的排序,但是数组的最后一个位置的数是最小的,我们要把它挪到第一个位置,其他位置的都要往后移动,要是这个数组非常大,那 ...
- JVM·垃圾收集器与内存分配策略之对象是否可被回收!
1.判断对象已经死去/不再被引用. 1.1.引用计数算法:给对象添加引用计数器,有个地方引用就+1,引用失效就-1.任何时刻,引用为0,即判断对象死亡. 1.1.1.优点:实现 ...
- Confluence 6 重构索引缓慢
你的索引构建是否需要很长时间?索引构建需要的时间是由下面的一些因素确定的: 你 Confluence 安装实例中的页面数量. 附件的数量,类型和大小. Confluence 安装实例可用的内存大小. ...
- Confluence 6 用户目录图例 - 只读连接 LDAP 整合本地用户组
上面的图:Confluence 连接到一 LDAP 目录,权限对本地用户组设置为只读. https://www.cwiki.us/display/CONFLUENCEWIKI/Diagrams+of ...