传送门
题目大意
给出n道题,假设答对了m道题,求最小的分数,有一个规则,就是连续答对num==k道题那么分数就翻倍,然后num清零,重新开始计数
思路
先找到最大的不翻倍的个数ans=n/k*(k-1)+n%k
如果m<=ans 那么答案就是m
接下来求m>ans的情况
一定是前面是连着的,越往前答案越小
答案就是连着的+后面不连的
后面不连着的个数ans-sheng*(k-1)
前面连着的个数 2k (2k+k)*2 (6k+k)*2 (14k+k)*2
会发现2 6 14 30 是2^(n+1)-2
这样就求出来了
代码
int main(){
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
ll ans=n/k*(k-1)+n%k;
if(ans>=m){//无连续
printf("%lld\n",m);
}
else{//有连续
ll sheng=m-ans;
ll ans1=0;
for(ll i=1;i<=sheng;i++){
ans1=(ans1+k)*2%mod;
}
ans=(ans1+ans-sheng*(k-1))%mod;
printf("%lld\n",ans);
}
}