Quiz--思维

据说cin 和 cout 比 scanf 要慢一些
有些程序,开头没有玄学优化,部分数据可能过不了

代码是抄的,
卡了挺久的,写一写思路:

k − 1 k-1 k1个正确的题,插入一个错题,这是一个区间
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 k1之后的k就填坑,之前已经填了 x x xx xx个坑,现在还需填 x 3 x_3 x3个坑

ll x3 = m - xx;

注意 x 3 ∗ k x_3*k x3k 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值