A

题意:O(-1)

思路:排个序搞定。

 

B

题意:O(-1)

思路:坑了我好久,这个框框水平垂直比例固定,分两种情况即可,不能旋转,我想多了,分了四种情况。

 

C

题意:一列n个位置,让你填m个数,当连续数达到k时,分数乘以2,计数清零,当不连续时,计数也清零,没到达k之前分数+1.

思路:很显然的问题是让我们处理填m个位置,并且使连续的k个数次数最少。我们先让m个数k-1每次填,填一次空一位,直到不够填了就往前面的空位填。设连续k个次数为mm,那么就是(((2*k)+k)*2……+k)*2,等比数列求和之后为k*(2^mm-2),不连续k的值为m-mm*k。注意要注意了细节很多,WA了两次。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 typedef long long lld;
 8 const lld mod=1000000009;
 9 
10 lld Pow(lld a, int b)
11 {
12     lld ans=1;
13     while(b)
14     {
15         if(b&1) ans=(ans*a)%mod;
16         b>>=1;
17         a=(a*a)%mod;
18     }
19     return ans%mod;
20 }
21 
22 int main()
23 {
24     lld n, m, k;
25     while(cin >> n >> m >> k)
26     {
27         lld c1, c2, s1, num, mm, ans=0;
28         c1=n/k, s1=n%k;
29         c2=m/(k-1);
30         num=min(c1,c2);
31         if(c1>c2) s1+=k*(c1-c2);
32         mm=m-num*(k-1);
33         mm-=min(mm,s1);
34         if(mm) ans=(k*((Pow(2,mm+1)-2+mod)%mod))%mod;
35         ans=(ans+m-k*mm%mod+mod)%mod;
36         cout << ans <<endl;
37     }
38 }
39 /*
40 23888888 508125 3
41 */
View Code

相关文章: