527 AC_mm玩dota【模运算】

AC_mm玩dota

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

 大家都知道AC_mm比较喜欢玩游戏,特别是擅长war3这款经典游戏。某天AC_mm来到了VS平台上 ,准备去虐菜鸟,正巧一个不小心将我们ACM队长虐了 ^_^,我们的队长这下可不高兴了,说要出一道难题让AC_mm难堪一下。题目描述是这样的,给一个正整数n,n在二进制表示的情况下(不含前导0和符号位)有a个1和b个0,求斐波拉契数列的第a*b项对1314520取模后的值ans。 

                                                                 注意(斐波拉契数列: f[0]=1,f[1]=1; f[n]=f[n-1]+f[n-2] ; n>=2;)

输入
输入:有多组测试数据,输入一个正整数n(n<1000000000);
输出
输出:ans的值
样例输入
12
6
样例输出
5
2

刚开始把问题想复杂了,估算一下,发现a*b的值能达到200+,然后甚至想到大数处理,打算写个大数斐波拉切的时候,突然发现,原来是取模的,额,这下好了,直接同余定理进行模运算就行,问题一下变简单了很多倍!由此感想,做题要好好看题,拓展一下思路,说不定就有意外的发现了!

哈哈...直接打表水过...



#include<stdio.h>
long long x[255];//保险起见开到 64 位
void db()
{
	x[0]=1;x[1]=1;
	for(int i=2;i<251;++i)
	{
		x[i]=(x[i-1]+x[i-2])%1314520;//只需要打出模运算之后的表
	}
}

int main()
{
	int n;db();
	while(~scanf("%d",&n))
	{
		int a=0,b=0;
		while(n)//统计二进制的 0 和 1 分别出现多少次
		{
			if(n&1)
			{
				++a;
			}
			else
			{
				++b;
			}
			n>>=1;
		}
		printf("%lld\n",x[a*b]);//输出对应结果
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值