(数据范围的公式渲染有一些问题,大概是$a\le b\le 100$)

洛谷4548,推导过程省略,直接给出答案——

令$p_{H}=\frac{b}{a}$,$p_{T}=\frac{b}{b-a}$,则$pre_{i}=\prod_{j=0}^{i-1}P_{s_{j}}$($s$下标从为$[0,n)$)

令$S=\{i|s[0,i)=s[n-i,n)\}$,则答案为$\sum_{i\in S}pre_{i}$(本来是一个后缀除以整个串)

然后这道题的坑点在于要用分数表示,之后就需要高精度

通分即先将分母都改为$pre_{n}$的分母,之后分子计算需要高精乘和除单精,可以做到$o(L^{2})$

高精度gcd通过除以2以及相减可以做到$o(L^{2})$(其中$L=2\cdot 10^{3}+3$),要写成非递归形式,否则会MLE

高精度除法二分+暴力高精度乘法可以做到$o(L^{3})$(由于fft自带的常数,$o(L^{2}\log_{2}L)$甚至会TLE)

常数较大,大概可以压$10^{7}$(防止乘100后爆int)可以过

(事实上数据极水,不约分可以得到90分)

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define L (N<<1)
5 #define ll long long
6 #define base 10000000
7 struct ji{
8 int l,a[L];
9 }zero,one,ans_zi,ans_mu,pre[N];
10 int n,pa,pb,nex[N],rev[L<<1];
11 char s[N];
12 int cmp(ji x,ji y){//x<y则返回-1,x=y返回0,x>y返回1
13 if (x.l!=y.l)return 1-(x.l<y.l)*2;
14 for(int i=x.l;i;i--)
15 if (x.a[i]!=y.a[i])return 1-(x.a[i]<y.a[i])*2;
16 return 0;
17 }
18 ji add(ji x,ji y){
19 x.l=max(x.l,y.l);
20 for(int i=1;i<=x.l;i++){
21 x.a[i]+=y.a[i];
22 if (x.a[i]>=base){
23 x.a[i]-=base;
24 x.a[i+1]++;
25 }
26 }
27 if (x.a[x.l+1])x.l++;
28 return x;
29 }
30 ji dec(ji x,ji y){
31 for(int i=1;i<=y.l;i++){
32 if (x.a[i]<y.a[i]){
33 x.a[i]+=base;
34 x.a[i+1]--;
35 }
36 x.a[i]-=y.a[i];
37 }
38 while ((x.l>1)&&(!x.a[x.l]))x.l--;
39 return x;
40 }
41 ji mul(ji x,int y){
42 x.a[1]=x.a[1]*y;
43 for(int i=2;i<=x.l;i++){
44 x.a[i]=x.a[i]*y+x.a[i-1]/base;
45 x.a[i-1]%=base;
46 }
47 if (x.a[x.l]>=base){
48 x.a[x.l+1]=x.a[x.l]/base;
49 x.a[x.l]%=base;
50 x.l++;
51 }
52 return x;
53 }
54 ji mul(ji x,ji y){
55 ji ans;
56 ans.l=x.l+y.l-1;
57 memset(ans.a,0,sizeof(ans.a));
58 for(int i=1;i<=x.l;i++)
59 for(int j=1;j<=y.l;j++){
60 ll s=1LL*x.a[i]*y.a[j];
61 ans.a[i+j]+=(ans.a[i+j-1]+s)/base;
62 ans.a[i+j-1]=(ans.a[i+j-1]+s)%base;
63 }
64 if (ans.a[ans.l+1])ans.l++;
65 return ans;
66 }
67 ji div(ji x,int y){
68 int r=0;
69 for(int i=x.l;i;i--){
70 r+=x.a[i];
71 x.a[i]=r/y;
72 r=(r%y)*base;
73 }
74 if ((x.l>1)&&(!x.a[x.l]))x.l--;
75 return x;
76 }
77 void write(ji x){
78 printf("%d",x.a[x.l]);
79 for(int i=x.l-1;i;i--){
80 if (x.a[i]<1000000)printf("0");
81 if (x.a[i]<100000)printf("0");
82 if (x.a[i]<10000)printf("0");
83 if (x.a[i]<1000)printf("0");
84 if (x.a[i]<100)printf("0");
85 if (x.a[i]<10)printf("0");
86 printf("%d",x.a[i]);
87 }
88 }
89 ji div(ji x,ji y){
90 ji l=zero,r=x,mid;
91 while (cmp(l,r)<0){
92 mid=div(add(l,r),2);
93 //write(l),printf(" "),write(r),printf(" "),write(mul(mid,y)),printf("\n");
94 if (cmp(mul(mid,y),x)<0)l=add(mid,one);
95 else r=mid;
96 }
97 return l;
98 }
99 ji gcd(ji x,ji y){
100 int cnt=0,deep=0;
101 while (cmp(x,y)){
102 int p1=(x.a[1]&1),p2=(y.a[1]&1);
103 if ((p1)&&(p2)){
104 if (cmp(x,y)<0)y=dec(y,x);
105 else x=dec(x,y);
106 continue;
107 }
108 if (!p1)x=div(x,2);
109 if (!p2)y=div(y,2);
110 if ((!p1)&&(!p2))cnt++;
111 }
112 ji ans=x;
113 while (cnt--)ans=mul(ans,2);
114 return ans;
115 }
116 int main(){
117 scanf("%d%d%s",&pa,&pb,s);
118 n=strlen(s);
119 zero.l=one.l=one.a[1]=1;
120 ans_mu=one;
121 for(int i=0;i<n;i++)
122 if (s[i]=='H')ans_mu=mul(ans_mu,pa);
123 else ans_mu=mul(ans_mu,pb-pa);
124 pre[0]=ans_mu;
125 for(int i=0;i<n;i++){
126 pre[i+1]=mul(pre[i],pb);
127 if (s[i]=='H')pre[i+1]=div(pre[i+1],pa);
128 else pre[i+1]=div(pre[i+1],pb-pa);
129 }
130 nex[0]=nex[1]=0;
131 for(int i=1,j=0;i<n;i++){
132 while ((j)&&(s[i]!=s[j]))j=nex[j];
133 if (s[i]==s[j])j++;
134 nex[i+1]=j;
135 }
136 for(int i=n;i;i=nex[i])ans_zi=add(ans_zi,pre[i]);
137 ji d=gcd(ans_zi,ans_mu);
138 write(div(ans_zi,d));
139 printf("/");
140 write(div(ans_mu,d));
141 }

[luogu3334]抛硬币的更多相关文章

  1. 模拟抛硬币(C语言实现)

    实现代码: #include<stdio.h> #include<stdlib.h> int heads() { ; } int main(int argc, char *ar ...

  2. bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]

    4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...

  3. [HNOI 2017]抛硬币

    Description 题库链接 两人抛硬币一人 \(a\) 次,一人 \(b\) 次.记正面朝上多的为胜.问抛出 \(a\) 次的人胜出的方案数. \(1\le a,b\le 10^{15},b\l ...

  4. bzoj 4830: [Hnoi2017]抛硬币

    Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是 已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A ...

  5. [AH/HNOI2017]抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  6. bzoj4830 hnoi2017 抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  7. luogu P3726 [AH2017/HNOI2017]抛硬币

    传送门 我是真的弱,看题解都写了半天,,, 这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\) 上面那个式 ...

  8. GMA Round 1 抛硬币

    传送门 抛硬币 扔一个硬币,正面概率为0.6.扔这枚硬币666次,正面就得3分,反面就得1分,求总分的方差. 直接套公式$np(1-p)*(X-Y)^2=666*0.6*(1-0.6)*(3-1)^2 ...

  9. 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)

    [BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...

随机推荐

  1. node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例)

    title: node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例) date: 2020-11-27 tags: node native sqlite3 前言 简单来 ...

  2. 「JOISC 2020 Day2」变态龙之色 题解

    题目传送门 注意 同性必定不同色 必有一个同色异性,且不相互不喜欢 Solution 我们发现,我们问题比较大的就是如何确定性别问题.我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系 ...

  3. 洛谷4631 [APIO2018] Circle selection 选圆圈 (KD树)

    qwq纪念AC450 一开始想这个题想复杂了. 首先,正解的做法是比较麻烦的. qwqq 那么就不如来一点暴力的东西,看到平面上点的距离的题,不难想到\(KD-Tree\) 我们用类似平面最近点对那个 ...

  4. Kubernetes-Service介绍(三)-Ingress(含最新版安装踩坑实践)

    前言 本篇是Kubernetes第十篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...

  5. 【c++ Prime 学习笔记】第14章 重载运算与类型转换

    14.1 基本概念 重载的运算符是特殊的函数:名字由关键字operator后接要定义的算符共同组成,也有返回类型.参数列表.函数体. 重载运算符函数的参数量与该算符作用的运算对象数量一样多 除重载调用 ...

  6. Java:ThreadLocal小记

    Java:ThreadLocal小记 说明:这是看了 bilibili 上 黑马程序员 的课程 java基础教程由浅入深全面解析threadlocal 后做的笔记 内容 ThreadLocal 介绍 ...

  7. [Beta]the Agiles Scrum Meeting 1

    会议时间:2020.5.9 21:00 1.每个人的工作 今天已完成的工作 讨论转会事项 经过组内成员的讨论,我们做出了非常艰难的决定:我们的组员老c将作为转会成员,离开我们的团队.感谢老c在Alph ...

  8. 基于jpa的specification实现动态查询

    spring data jpa为我们实现简单的crud操作提供了极大的方便.但大部分情况下,系统中都存在大量的动态查询操作,这个时候就可以借助spring data jpa的 Specificatio ...

  9. Noip模拟72 2021.10.9

    T1 出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按 ...

  10. Ubuntu鼠标变十字 不能点击

    出现这种情况,应该是bash 直接运行了python文件 系统中出现了一个import 进程. python文件中除了注释应该是import在最前边 ps -ef|grep import 可以查看系统 ...