据说cin 和 cout 比 scanf 要慢一些
有些程序,开头没有玄学优化,部分数据可能过不了
代码是抄的,
卡了挺久的,写一写思路:
每
k
−
1
k-1
k−1个正确的题,插入一个错题,这是一个区间
有
n
/
k
n/k
n/k个区间
剩下的题数不够一个区间的时候,n % k
加起来就是不加倍的情况下正确题数
ll x1 = n%k;
ll x2 = n/k * (k-1);
ll xx = x1 + x2;
填坑:题回答正确
需要加倍题,每遇到
k
−
1
k-1
k−1之后的k就填坑,之前已经填了
x
x
xx
xx个坑,现在还需填
x
3
x_3
x3个坑
ll x3 = m - xx;
注意 x 3 ∗ k x_3*k x3∗k , k k k是一个区间,一共有 x 3 x_3 x3个区间, x 4 x_4 x4是凑不够区间了的数
ll x4 = m - x3*k;
pow(n) 计算2的n次方
从第一题开始,每次遇到就加倍:
ll ans = 2 * ( Pow((ll)x3) - 1 ) * k % mod;
#include<bits/stdc++.h>
#define ll long long
const int mod = 1e9+9;
using namespace std;
ll Pow(ll n)
{
ll k = 2, ans = 1;
while (n){
if(n&1) ans = (ans*k)%mod;
k = (k*k)%mod;
n >>= 1;
}
return ans;
}
void solve()
{
int n, m, k;
cin >> n >> m >> k;
ll x1 = n%k;
ll x2 = n/k * (k-1);
ll xx = x1 + x2;
if (xx >= m){
cout << m << endl;
return ;
}
ll x3 = m - xx;
ll x4 = m - x3*k;
ll ans = 2 * ( Pow((ll)x3) - 1 ) * k % mod;
ans = (ans%mod + x4) % mod;
cout << ans << endl;
}
int main()
{
solve();
return 0;
}