
2020-10-12 大二2020cf训练
发布日期:2021-05-07 23:18:45
浏览次数:22
分类:原创文章
本文共 2269 字,大约阅读时间需要 7 分钟。
Powered by:AB_IN 局外人
题意: n n n只能由1和2组成,找最小的组成元素数 i i i,使得 i % m = = 0 i\%m==0 i%m==0
分情况讨论:
- 如果 n n n为奇数,那么它最少组成为 ( n / / 2 ) (n//2) (n//2)个2, 1 1 1个1。最多组成为 n n n个1。所以就是找 [ n / / 2 + 1 , n ] [n//2+1,n] [n//2+1,n]中, m m m的最小倍数。
- 如果 n n n为偶数,那么它最少组成为 ( n / / 2 ) (n//2) (n//2)个2。最多组成为 n n n个1。所以就是找 [ n / / 2 , n ] [n//2,n] [n//2,n]中, m m m的最小倍数。
n,m=map(int,input().split())if n<m: print(-1)elif n&1: tmp=(n-1)//2+1 for i in range(tmp,n+1): if i%m==0: print(i) breakelse: tmp=n//2 for i in range(tmp,n+1): if i%m==0: print(i) break
按照题意模拟即可。
还是分情况讨论,先统计好 + , − , ? +,-,? +,−,?。原串的值 s _ a n s s\_ans s_ans就是加号的数量减去减号的数量。编译串 c _ a n s c\_ans c_ans也这么处理,只不过也统计一下 ? ? ?的数量。
- 没有 ? ? ?的话,看 s _ a n s s\_ans s_ans是否等于 c _ a n s c\_ans c_ans,如果等于就是1,不等就是0。
- 有 ? ? ?的话,先用 c h a = s _ a n s − c _ a n s cha=s\_ans-c\_ans cha=s_ans−c_ans,如果大于0,说明需要多少加号;小于0,说明需要多少减号。由于只有两种形式(+,-),所以问号的数量 − c h a -cha −cha一定为偶数,它们各一个加号一个减号排下去,正好抵消。
剩下的就是 n n n个加号 m m m个减号的组合问题。
直接公式为:
( m + n ) ! m ! × n ! \frac {(m+n)!} {m!×n!} m!×n!(m+n)!
或者用递归函数:
def f(m,n): if m==0 or n==0 :return 1 return f(m-1,n)+f(m,n-1)
def f(m,n): if m==0 or n==0 :return 1 return f(m-1,n)+f(m,n-1)s=input()c=input()s_ans=0c_ans=0cnt=0for i in s: if i == "+": s_ans+=1 if i == "-": s_ans-=1for i in c: if i == "+": c_ans+=1 if i == "-": c_ans-=1 if i == "?": cnt+=1if c.find("?")==-1 and s_ans==c_ans: print("1.000000000000")elif c.find("?")==-1 and s_ans!=c_ans: print("0.000000000000")elif abs(s_ans-c_ans)>cnt: print("0.000000000000")else: cha=s_ans-c_ans #需要多少加号 jia=0 jian=0 if cha>0: jia+=cha else: jian-=cha jia+=(cnt-abs(cha))//2 jian+=(cnt-abs(cha))//2 print(f'{f(jia,jian)/2**cnt:.9f}')
推数学公式的题
首先可以推出
x = d b + m x=db+m x=db+m
k = d m k=\frac {d} {m} k=md
所以
x = m ( k b + 1 ) x=m(kb+1) x=m(kb+1)
而 1 ≤ m ≤ b − 1 1 \le m \le b-1 1≤m≤b−1
运用等差数列前n项和性质
这里 n = ( ( b − 1 ) − 1 ) + 1 n=((b-1)-1)+1 n=((b−1)−1)+1
所以
∑ k = 1 a ( k b + 1 ) b ( b − 1 ) 2 \sum_{k=1}^a (kb+1) \frac{b(b-1)}{2} k=1∑a(kb+1)2b(b−1)
mod=1000000007a,b=map(int,input().split())m=(b*(b-1)//2)%modans=0for k in range(1,a+1): ans=(ans+m*(k*b+1))%modprint(ans)
完结。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月23日 10时55分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(3.2-3.8)
2019-03-06
[网站公告]3月10日23:00-4:00阿里云SLB升级,会有4-8次连接闪断
2019-03-06
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
2019-03-06
上周热点回顾(7.27-8.2)
2019-03-06
上周热点回顾(9.28-10.4)
2019-03-06
上周热点回顾(3.28-4.3)
2019-03-06
上周热点回顾(5.2-5.8)
2019-03-06
上周热点回顾(5.9-5.15)
2019-03-06
上周热点回顾(8.8-8.14)
2019-03-06
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2019-03-06
上周热点回顾(1.16-1.22)
2019-03-06
上周热点回顾(1.23-1.29)
2019-03-06
上周热点回顾(3.20-3.26)
2019-03-06
上周热点回顾(4.24-4.30)
2019-03-06
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2019-03-06
上周热点回顾(5.1-5.7)
2019-03-06
上周热点回顾(5.29-6.4)
2019-03-06
上周热点回顾(6.19-6.25)
2019-03-06
云计算之路-阿里云上:docker swarm 集群故障与异常
2019-03-06