列表

详情


NC218879. 来上数学课

描述


给出n个连续的题目,已知小明答对了m题。求小明所获得的最低分数是多少?

计分 规则:当答对一题的时候总分加一,同时计分器的分数加一。当答错时,
计分器清零,且总分不改变。但连续答对k题时,也就是计分器分数达到k分时,选手的总分加倍。
当然,是先将第k题的一分加上去后,总分才加倍, 同时计分器清零。

答案对1e9+9取余。

输入描述

每行三个整数 n, m 和 k (2 ≤ k ≤ n ≤ 1e9; 0 ≤ m ≤ n).
输入不唯一

输出描述

每行一个整数,代表最低分数。

示例1

输入:

6 5 2

输出:

13

说明:

显然,错误的题目是第6题的时候,分数变化为 1->4->5->12->13->13 

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 2ms, 内存消耗: 368K, 提交时间: 2021-03-07 19:58:08

#include<stdio.h>
#define ll long long
ll mod=1e9+9,res;
ll ksm(ll x,ll p)
{
	ll ans=1;
	while(p) {
		if(p&1) ans=ans*x%mod;
		x=x*x%mod;
		p>>=1;
	}
	return ans;
}
int main()
{
	int n,m,k;
	while(~scanf("%d%d%d",&n,&m,&k))
	{
		int w=n-m;
		if(w>=n/k)
        {
            printf("%d\n",m);
            continue;
        }
        int t=n/k-w;
		res=((ksm(2,t+1)-2)*k+m-t*k+2*mod)%mod;
		printf("%lld\n",res);
	}
}

C++(clang++11) 解法, 执行用时: 2ms, 内存消耗: 376K, 提交时间: 2021-03-09 16:25:57

#include<bits/stdc++.h>
using namespace std;
const int w=1e9+9;
int main()
{

    int n,m,k,i,cnt=0,h=0;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=m;i++)
    {
       cnt++;
       h++;
       if(cnt==k)
       {
           h=(h*2)%w;
           cnt=0;
       }

    }
    printf("%d\n",h%w);
    return 0;

}

上一题