Hdu 4599

来源:互联网 发布:计划任务软件 编辑:程序博客网 时间:2024/05/18 18:18

题目

对于 F(N)=1+6*F(N-1)   =>   F(N)+1/5=6(F(N-1)+1/5);  =>  F(1)=1   =>    F(N) = (6^N)/5-1/5;

对于 H(N)=6*F(N);

对于 G(N)=6*N;


我也不知道这样为什么是正确,好像正规的推导是倒着来,  F(N)=1/6 *(1+ F(N+1))+5 / 6 *(1+F(1)),F(N)=0   //(有1/6的可能一样,剩余的5/6将回归到F(1));

也就是我们要求 6*m1>= (6^N)/5-1/5,6*m2>=6*( (6^N)/5-1/5);


用逆元.

(摘自:http://hi.baidu.com/zhanggmcn/item/ef4dadceb4fb993e449416e7)

对于(a/b)%mod,如果b为a的因数,那么对于b的逆元c(b*c%mod==1)

有(a/b*1)%mod=(a/b*b*c)%mod=(a*c)%mod;

所以可以求出b的乘法逆元.

方一: 扩展欧几里得:bx+mod*y=1解出的x就是b的乘法逆元

方二:如果mod是素数,那么b的逆元为  b^(mod-2)%mod;


首先对于m2>=(6^n-1)/5,显然6^n的各位是6,减去1后,能被5整除,加上mod2011是素数,所以可以直接做.

对于m1>=(6^n-1)/30,为了整除,且m1最小,m1=(6^+24)/30;


#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;#define mod 2011typedef long long ll;inline ll Pow(ll a,ll n){ll ans=1,t=a;while(n){if(n%2) ans=ans*t%mod;n/=2;t=t*t%mod;}return ans;}ll n;int main(){while(~scanf("%I64d",&n)){ll m1,m2;ll ny=Pow(5,mod-2);m2=(Pow(6,n)-1+mod)%mod*ny%mod;ny=Pow(30,mod-2);m1=(Pow(6,n)+24)%mod*ny%mod;printf("%I64d %I64d\n",m1%mod,m2%mod);}//system("pause");return 0;}




原创粉丝点击