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_ansc_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 1mb1
运用等差数列前n项和性质
在这里插入图片描述
这里 n = ( ( b − 1 ) − 1 ) + 1 n=((b-1)-1)+1 n=((b1)1)+1
所以
∑ k = 1 a ( k b + 1 ) b ( b − 1 ) 2 \sum_{k=1}^a (kb+1) \frac{b(b-1)}{2} k=1a(kb+1)2b(b1)


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)

完结。

上一篇:Py3 基本知识补充
下一篇:“红旗杯“第十四届东北地区大学生程序设计竞赛-热身赛

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年03月23日 10时55分27秒