最近参加了很多CH上的比赛呢~Rating--了。。题目各种跪烂。各种膜拜大神OTZZZ

描述

萌蛋有n颗珠子,每一颗珠子都写有一个数字。萌蛋把它们用线串成了环。
我们称一个数字串是有趣的,当且仅当它的第1位是2,且除了第1位以外的每一位都是3。例如,2,233,2333333都是有趣的数字串。
现在,你可以从这串珠子的任意一颗开始读,沿着顺时针或逆时针方向,到任意一颗珠子停止。这样,你就可以读出一个数字串来。
萌蛋想知道,所有能读出的有趣的数字串当中,最长的是哪一个数字串。当然,你也可能读不出任何一个有趣的数字串,你也需要对这种情况做出判断。

输入格式

输入只有一行,是一个数字串。这是从这串珠子的某一颗开始,顺时针读取恰好一圈得到的。

输出格式

输出只有一行,是能读出的最长有趣的数字串。特殊地,如果找不到任何有趣的数字串,应输出“TvT”(不含引号)。

  对于每一个2的位置向右或者向左扫,每个点最多被扫到2遍,O(n)复杂度。

T2免农

萌蛋近年收入不景气,正在她发愁如何能多赚点钱时,她听到隔壁的小朋友在讨论免子繁殖的问题。(注:免子是一种简单的单细胞生物)
问题是这样的:时刻0有2只刚出生的免子。每一时刻,每只免子都会分裂成为2只免子。问时刻n共有多少只免子?
聪明的你可能已经发现,时刻n的免子数正好是第n+1个2的幂次。萌蛋不懂什么叫幂,但她也发现了规律:时刻n+1的免子数等于时刻n的免子数的2倍。前几个时刻(从0开始)的免子数依次为:
2 4 8 16 32 64 128 256 512 …
萌蛋发现越到后面免子数增长的越快,期待养免子一定能赚大钱,于是萌蛋在时刻0买了2只免子开始培养。
每天,萌蛋都要给免子们提供营养。免子的培养基非常特别,每k只免子占据一个培养基,最后剩下的不足k只占据一个培养基。由于免子特别害怕孤独,如果某个培养基只有1只免子,这只免子就会很快死掉。
然而,每个时刻的免子数仍然是可以计算的。例如,当k=7时,前几个时刻(从0开始)的免子数依次为:
2 4 7 14 28 56 112 224 448 …
给定n,你能帮助萌蛋计算时刻n她有多少只免子么?由于答案可能非常大,你只需要告诉萌蛋时刻n的免子只数对p的余数即可。

输入格式

输入只有一行,包含三个整数n k p。(n<=1,000,000,000  k,p<=1,000,000)

输出格式

输出只有一行,为一个整数,表示时刻n的免子只数对p的余数。

可以发现,如果死了一次免子,那么就再也不会死免子了。所以我们只需要找到第一次死免子的时候即可。

又可以发现,第一次死免子必定发生在前k秒内。因为免子数 Mod k只有k种可能性。免子数Mod k的结果如果在出现了重复之前没有死免子,就显然不会再死免子。

如果第i秒死了一只免子,死后还剩下l只免子则最后的答案为l*2^(n-i) mod p

复杂度 O(k+log(n))

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <set>
11 #include <list>
12 #include <vector>
13 #include <ctime>
14 #include <functional>
15 #define pritnf printf
16 #define scafn scanf
17 #define For(i,j,k) for(int i=(j);i<=(k);(i)++)
18 using namespace std;
19 typedef long long LL;
20 typedef unsigned int Uint; 
21 const int INF=0x7ffffff;
22 //==============struct declaration==============
23 
24 //==============var declaration=================
25 const int MAXN=1000010;
26 LL n,k,MOD,p;
27 set <LL> Exist;
28 //==============function declaration============
29 LL gcd(LL a,LL b);
30 LL lcm(LL a,LL b);
31 LL quickpow(LL a,LL Exp);
32 //==============main code=======================
33 int main()
34 { 
35   cin>>n>>k>>p; 
36   MOD=p*k;
37   LL fact=2;
38   if (k==1){printf("0\n");return 0; }
39   For(i,1,k){
40     fact=fact*2;
41     if (i>n) break;
42     if (fact%k==1){
43       fact--;
44       printf("%lld\n",(fact%p*quickpow(2,n-i)%p)%p);
45  
46       return 0;
47     }
48     fact=fact%MOD;
49   }
50   printf("%lld\n",quickpow(2,n+1)%p);
51 
52   return 0;
53 }
54 //================fuction code====================
55 LL quickpow(LL a,LL Exp)
56 {
57   if (Exp==0)
58     return 1;
59   if (Exp==1)
60     return a;
61   LL t=quickpow(a,Exp/2)%p;
62   t=(t*t)%p;
63   if (Exp&1)
64     t*=a;
65   return t%p;
66 }
67 LL lcm(LL a,LL b)
68 {
69   return a/gcd(a,b)*b;
70 } 
71 LL gcd(LL a,LL b)
72 {
73   return a%b==0?b:gcd(b,a%b);
74 }
T2代码

相关文章: