A.
在m个数中选n个数,使n个数的( 最大值-最小值 ) 最小,求出这个差值最小值
先对m个数排序,处理每串连续的n个数
B.
把电影横着放和竖着放,看 a/b 与 c/d决定
C.
先考虑,每次答对k-1道题后,就打错了,这样可以得分 sum=(k-1)*(n/k)+n%k;
如果sum>=m 显然输出(m%mod)
否则,前面的(m-sum)个第k题要答对
这样剩下的就是 sum=sum-(m-sum)*(k-1);
然后对于前面(m-sum)个连续的k求解。
A1=2*k
A2=(A1+k)*2
。
。
。
An=(An-1 +k)*2
也就是 An = (An-1 *2+2k)
也就是 (An+2k) = (An-1 + 2k)*2;
所以前面(m-sum)连续的k得分 :A(m-sum)=(A1+2k)*2^(m-sum-1),等比列求和
Ps:注意取余是10^9+9,习惯性的写成+7,就WA了。。。。。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define mod 1000000009
typedef __int64 ll;
ll n,m,k;
ll Pow(ll a,int b)
{
ll ans=1;
ll t=a;
while(b)
{
if(b%2) ans=(ans*t)%mod;
b/=2;
t=(t*t)%mod;
}
return ans;
}
int main()
{
while(~scanf("%I64d%I64d%I64d",&n,&m,&k))
{
ll a=n/k;
ll sum=a*(k-1)+n%k;
if(sum>=m)
{
printf("%I64d\n",m%mod);
}
else
{
ll b=m-sum;
sum-=b*(k-1);
ll p=(4*k)%mod*Pow(2,b-1)%mod;
p%=mod;
p-=2*k;
p=(p+mod)%mod;
sum+=p;
sum=(sum+mod)%mod;
printf("%I64d\n",sum);
}
}
}