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 */