原文链接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)$ 。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int N=100005;
  5. int T,ps[N],x[N],y[N],px[N],pt[N];
  6. char s[N];
  7. int Pow(int x,int y,int mod){
  8. int ans=1;
  9. for (;y;y>>=1,x=1LL*x*x%mod)
  10. if (y&1)
  11. ans=1LL*ans*x%mod;
  12. return ans;
  13. }
  14. int phi(int x){
  15. int ans=x;
  16. for (int i=2;i*i<=x;i++){
  17. if (x%i==0){
  18. ans=ans/i*(i-1);
  19. while (x%i==0)
  20. x/=i;
  21. }
  22. }
  23. if (x>1)
  24. ans=ans/x*(x-1);
  25. return ans;
  26. }
  27. int solve(int j,int k){
  28. if (j==0||pt[j]>0)
  29. return pt[j];
  30. int i=j;
  31. while (i>0&&s[i]!='2')
  32. i--;
  33. int t=i==0?0:((6LL*Pow(2,solve(i-1,k+1),x[k])-3)%x[k]);
  34. for (int p=i+1;p<=j;p++){
  35. if (s[p]=='0')
  36. t=(t+1)%x[k];
  37. if (s[p]=='1')
  38. t=(2*t+2)%x[k];
  39. }
  40. t=((t-y[k])%x[k]+x[k])%x[k];
  41. return t+y[k];
  42. }
  43. int main(){
  44. ps[0]=1e9+7;
  45. for (int i=1;i<=100000;i++)
  46. ps[i]=phi(ps[i-1]);
  47. for (int i=1;i<=100000;i++){
  48. for (x[i]=ps[i-1],y[i]=0;x[i]%2==0;x[i]>>=1,y[i]++);
  49. x[i]=phi(x[i]);
  50. }
  51. x[0]=ps[0],y[0]=0;
  52. scanf("%d",&T);
  53. while (T--){
  54. scanf("%s",s+1);
  55. int n=strlen(s+1),i=0;
  56. for (int x=0;i<n;i++,pt[i]=x){
  57. if (s[i+1]=='0')
  58. x++;
  59. if (s[i+1]=='1')
  60. x=x*2+2;
  61. if (s[i+1]=='2')
  62. x=6*Pow(2,x,1e9+7)-3;
  63. if (x>=21)
  64. break;
  65. }
  66. printf("%d\n",(solve(n,0))%ps[0]);
  67. for (;i>0;i--)
  68. pt[i]=0;
  69. }
  70. return 0;
  71. }

  

2018牛客网暑假ACM多校训练赛(第四场)A Ternary String 数论的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  4. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  6. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  7. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  8. 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...

  9. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

  10. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...

随机推荐

  1. MVC5访问SQL Server数据库

    参考: MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例 1.新建MVC项目: 新建基于MVC5的项目,命名为PracticeProject 2.Models文件夹(右击) ...

  2. web.xml详细选项配置

    Web.xml常用元素 <web-app> <display-name></display-name>定义了WEB应用的名字 <description> ...

  3. swift 学习- 11 -- 属性

    // '属性'将值跟特定的类, 结构体或枚举关联, 存储属性常量或变量作为实例的一部分,而计算属性计算(不是存储) 一个值, 计算属性可以用于 类, 结构体, 枚举, 存储属性只能用于 类 和 结构体 ...

  4. 什么是orm思想?

    什么是orm思想? 1.hibernate使用orm思想对数据库进行crud操作 2.在web阶段学习javabean更正确的叫法是:实体类 3.orm: object   relational   ...

  5. day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)

    多态是OOP的三大特征之一 字面意思:多种形态 多种状态 官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征) 多态不是什么新技术 我们编写面向对象的程序时 其实就有多态 ...

  6. 【python】统一转换日期格式dateutil.parser.parse

    背景: 我有很多很多的日志数据,每个日志里面都有日期字符串,我需要将其转换为datetime格式. 问题是,这些日志里的字符串格式五花八门,有2017-05-25T05:27:30.313292255 ...

  7. C++ 关于ShowWindow()的疑问

    IDE: Code::Blocks 16.01 操作系统:Windows 7 x64 最初的代码,目的是为了隐藏窗口出现在任务栏上的图标. #include <windows.h> usi ...

  8. Spring Cloud与Spring Boot版本匹配关系

    Spring Cloud是什么? “Spring Cloud provides tools for developers to quickly build some of the common pat ...

  9. python函数系列之sorted()

    一. 有时候需要对List.Dict进行排序 二.用法:sorted(iterable, cmp=None, key=None, reverse=False) 三.参数说明: iterable:是可迭 ...

  10. Memcached 快速入门

    Memcached简介 Memcached是一个专门用来做缓存的服务器,而且缓存的数据都在内存中.Memcached就相当于一个Dictionary键值对集合,保存的是键值对,然后根据key取valu ...