CF992C Nastya and a Wardrobe
题意很清晰,这种题,我们当然还是有两种方法来做啦
方法一:找规律
读完题我们来看样例,通过样例一已我们大概可以看出,答案或许是\(n*2^{k+1}\)
肯定不能这么简单对吧,那就来看样例二,难道答案是\(n*2^{k+1}-k\)或者是\(n*2^{k+1}-2^{k-1}\)也有可能是\(n*2^{k+1}-2^k+1\)
通过样例三可得,答案是\(n*2^{k+1}-2^k+1\)
方法二:数学证明
每个月都是乘2,所以第i个月取走一个对第j个月的影响就是\(2^{j-i}(i<j)\)
那么每个月都会对最后一个月产生影响,影响总和是$ \sum _ {i=0} ^ {k-1} 2^i $,也就是\(2^k-1\)
这是负的影响,正的影响很容易算,就是\(n*2^{k+1}\)
说白了,每个月要么直接乘二,要么-1再乘二,我们把这个-1提出来,就分成了上面所说的正贡献和负贡献
千万别忘了特判等于零,还有直接乘会爆long long
下面放代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define mo 1000000007
using namespace std;
inline ll read(){
	ll a=0;int f=0;char p=gc();
	while(!isdigit(p)){f|=p=='-';p=gc();}
	while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
	return f?-a:a;
}
ll n,k,k1,e=2,sum=1;
inline ll cheng(ll a,ll b){
	ll sum=0;
	while(b){
		if(b&1)sum=(sum+a)%mo;
		a=(a<<1)%mo;b>>=1;
	}
	return sum;
}
int main(){
	n=read();k1=k=read();++k;
	if(n==0){
		puts("0");
		return 0;
	}k%=mo-1;
	while(k){
		if(k&1)n=cheng(n,e)%mo;
		e=cheng(e,e)%mo;k>>=1;
	}e=2;k1%=mo-1;
	while(k1){
		if(k1&1)sum=cheng(sum,e)%mo;
		e=cheng(e,e)%mo;k1>>=1;
	}
	--sum;if(sum<0)sum+=mo;
	printf("%lld\n",((n-sum)%mo+mo)%mo);
	return 0;
}
不要抄代码哦
CF992C Nastya and a Wardrobe的更多相关文章
- CF992C Nastya and a Wardrobe 数学 第四道
		
Nastya and a Wardrobe time limit per test 1 second memory limit per test 256 megabytes input standar ...
 - CF思维联系– CodeForces -CodeForces - 992C Nastya and a Wardrobe(欧拉降幂+快速幂)
		
Nastya received a gift on New Year - a magic wardrobe. It is magic because in the end of each month ...
 - Codeforces 992C Nastya and a Wardrobe (思维)
		
<题目链接> 题目大意: 你开始有X个裙子 你有K+1次增长机会 前K次会100%的增长一倍 但是增长后有50%的机会会减少一个 给你X,K(0<=X,K<=1e18), 问你 ...
 - Nastya and a Wardrobe CodeForces - 992C(规律)
		
写一下二叉树 推一下公式就出来了, 注意取模时的输出形式 #include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a ...
 - CodeForces 992C Nastya and a Wardrobe(规律、快速幂)
		
http://codeforces.com/problemset/problem/992/C 题意: 给你两个数x,k,k代表有k+1个月,x每个月可以增长一倍,增长后的下一个月开始时x有50%几率减 ...
 - Codeforces Round #489 (Div. 2)
		
A. Nastya and an Array time limit per test 1 second memory limit per test 256 megabytes input standa ...
 - Codeforces Round #489 (Div. 2) B、C
		
B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...
 - [Codeforces]Codeforces Round #489 (Div. 2)
		
Nastya and an Array 输出有几种不同的数字 #pragma comment(linker, "/STACK:102400000,102400000") #ifnd ...
 - ACM思维题训练 Section A
		
题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...
 
随机推荐
- VB.NET 仿Edge风格的TabControl控件
			
原本是想写个Chrome内核的浏览器,但是.net语言下比较好用类库的并不多,尝试过CefSharp.Xilium.CefGlue,都发现很多坑,所以这个项目就烂尾了,现在将还有点用的代码发出来给大家 ...
 - 41F继电器座的解剖与妙用
			
摘要:如果继电器不是焊在电路板上使用,就需要有个插座,这样方便接线,否则继电器的管脚是没法固定导线的.实际项目中使用了HF41F的继电器(宏发),在选择继电器座的时候,有一点感想,分享给大家.继电器是 ...
 - hdu2795 Billboard(线段树单点修改)
			
传送门 结点中的l和r表示层数,maxx表示这层最多还剩下多少宽度.根据公告的宽度取找到可以放的那一层 找到后返回层数,并修改maxx #include<bits/stdc++.h> us ...
 - 如何在忘记mysql的登录密码时更改mysql登录的密码(window及linux)
			
最近一直在边学习边开发java项目,理所当然的就少不了跟数据库打交道了,但是有时候就会脑子一短路,把mysql的登录密码给忘记了,这个时候我们又很急切的需要进到数据库中查看数据,那这个时候要怎么才能改 ...
 - 角色和武器Shader特效开发
			
角色Shader的动效需求 角Shader的开发不知要实现最基础光照等功能, 可能还要在角色武器的Shader增加多种动效, 比如因武器品质区分的流光特效, 被技能击中时的冻结效果. 这类动效的实现方 ...
 - NIKTO介绍及使用方法
			
1. NIKTO:perl语言开发的开源WEB安全扫描器:识别网站软件版本:搜索存在安全隐患的文件:检查服务器配置漏洞:检查WEB Application层面的安全隐患:避免404误判(原因:很 ...
 - Robot的使用
			
在Java中,有一个类,非常神奇,它能帮助你完成某些任务,例如:打开笔记本/QQ等. 今天,我就说一下Robot类的使用方法吧,做一个打开记事本的小程序. 1.准备工作 JDK:不知道的别看了 开发工 ...
 - 【Kubernetes】基于角色的权限控制:RBAC
			
Kubernetes中所有的API对象,都保存在Etcd里,对这些API对象的操作,一定都是通过访问kube-apiserver实现的,原因是需要APIServer来做授权工作. 在Kubernete ...
 - Ubuntu16.04安装vmware workstation14
			
1.获得vmware安装包:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html?ClickI ...
 - tac命令详解
			
基础命令学习目录首页 原文链接:http://blog.chinaunix.net/uid-128922-id-289974.html 有许多命令都可以查看文件,不同的命令有不同的优点,可以针对不同的 ...