欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU - 4990

程序员文章站 2022-07-12 09:41:59
...

题目链接:

https://vjudge.net/contest/280104#problem/G

碎碎念:

第一篇博客 ε≡٩(๑>₃<)۶
一开始不知道这题在干什么,网上找了很久,看了很多人的答案,理解后自己写了出来。

代码

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
typedef long long ll;

const int maxn = 1e6 + 10;


/*		直接复制题目代码会TLE
		关键是找规律:1 2 5 10 21 42 85.......
		第一个奇数为01, 第二个为101, 第三个为10101 
		当n为奇数:f(n) = 1 + 2^2 + 2^4 + ... + 2^(n-1) = 4^0 + 4^1 + 4^2 + .... + 4^((n-1)/2)  = (2 ^(n+1) - 1) / 3
		当n为偶数: f(n) = 2 * (4^0 + 4^1 + 4^2 + .... + 4^((n-2)/2)) = (2 ^(n + 1) - 2) / 3
 
*/


ll quick_pow(ll a, ll n, ll mod){
	ll ans = 1;
	while(n>0){
		if(n & 1){
			ans = ans * a % mod;
		}
		a = a * a % mod;
		n >>= 1;
	}
	return ans;
}


int main(){

	ll n, m;
	while(scanf("%lld%lld", &n, &m) != EOF){
		ll ans = 0;
		
		if(n & 1){
			ans = (quick_pow(2, n+1, 3 * m) - 1) / 3;			//mod3
		}
		else{
			ans = (quick_pow(2, n+1, 3 * m) - 2) / 3;			//这是由上面推导而来,不可能出现负数 
		}
	
		printf("%lld\n", ans);

	}

	return 0;
} 

相关标签: acm