这题有三个函数,
F(N)表示有数字连续向上N次操作数的期望值;
H(N)表示数字1连续向上N次操作数的期望值;
G(N)表示数字1向上N次的操作数的期望值;
题目给定N求,满足G(m1)>=F(N)的最小m1与G(m2)>=F(N)的小m2.
由于N很大,所有思路是求出F(N)、H(N)、G(N)的通式。
其中G(N)=6N;H(N)=(6^n-1)/5*6;F(N)=H(N-1)+1;
所以m2=(6^n-1)/5;m1=(6^(n-1)-1)/5+1;
剩下的就是写代码问题了。
#include<stdio.h>
#define mod 2011
int pow(int a,int b,int m){
int ans=1;
while(b){
if(b&1){
ans=ans*a%m;
}
a=a*a%m;
b=b>>1;
}
return ans;
}
int ex(int a,int b,int &x,int &y){
int d;
if(b==0){
x=1;y=0;
return a;
}
d=ex(b,a%b,y,x);
y-=a/b*x;
return d;
}
int inv(int a,int n){
int d,x,y;
d=ex(a,n,x,y);
if(d==1)return (x%n+n)%n;
else return -1;
}
int main(){
int n,m1,m2;
int ni=inv(5,mod);
while(~scanf("%d",&n)&&n){
if(n==1){printf("1 1\n");continue;}
//else if(n==2){printf("2 7\n");continue;}
m2=(pow(6,n,mod)-1+mod)*ni%mod;
m1=(pow(6,n-1,mod)-1+mod)*ni%mod;
m1=(m1+1)%mod;
printf("%d %d\n",m1,m2);
}
return 0;
}