Hdu 4599

题目

对于 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 2011
typedef 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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值