To Boldly Go Where No One|

园龄:粉丝:关注:

[题解]EER1迫害

题目地址: P6195 [EER1]迫害

这个题要不给样例说明似乎就难了一点

本题是快速幂的应用

由于 m 是可自由确定,我们发现选取 k(n+1) 是最优选择。根据二进制划分的原理,要想得到更多的组合(每个只用一遍) m=2k(n+1) 最优。

以样例2为例

n=2 时我们可以得到如下方式组合

1,1+1

然后添加 m

1,1+1,3,3+1,3+1+1,6,6+1,6+1+1,6+3,6+3+1,6+3+1+1

所以可得公式

ans=(n+1)2m+n

当然最后要取模(不过就多%几遍就好了

代码仅供参考,码风较为混乱

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
#include<queue>

using namespace std;

#define rg register
#define ll long long
#define int unsigned long long

namespace Enterprise{

	inline int read(){
		rg int s=0,f=0;
		rg char ch=getchar();
		while(not isdigit(ch)) f|=(ch=='-'),ch=getchar();
		while(isdigit(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
		return f?-s:s;
	}
	
	int mod=1e9+7;
	int n,m;
	
	inline int ksm(int b){
		int ans=1;
		int p=2;
		while(b){
			if(b&1) ans=ans*p%mod;
			b>>=1;
			p=p*p%mod;
		}
		return ans;
	}
	
	inline void main(){
		n=read(),m=read();
		printf("%d",(((((n+1)%mod)*(ksm(m)-1)%mod)%mod+n)%mod));	
	}
}

signed main(){
	Enterprise::main();
	return 0;
}

本文作者:UssEnterprise

本文链接:https://www.cnblogs.com/UssEnterprise/p/12459360.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   UssEnterprise  阅读(179)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起