前言
今天\(T1\)快速幂(可惜我假期摸鱼……)\(T2\)是字典树(正解其实应该是AC自动机,但是没人会……)\(T3\)竟然整了一个哈希dp……当场自闭。\(T4\)多种方法,最短路,暴力dp,线段树均可。总的来说就是自闭的一天……(说实话,今天老师选的题真的是开玩笑一样)
题目描述
\(LSZ\)很皮!\(LSZ\)的皮肤衣更皮!
\(LSZ\)有很多件神奇的皮肤衣,而且\(LSZ\)总是喜欢一次穿上多件皮肤衣(一件套一件,而且一直穿好多天),这些皮肤衣有透明或不透明两种状态,当不透明的皮肤衣吸收了一天的阳光直射后,就会变成透明的皮肤衣,透明的皮肤衣能使阳光照射到里层皮肤衣,而透明的皮肤衣再吸收阳光,会在第二天会变成不透明的皮肤衣,不透明的皮肤衣会阻止阳光照射到里层皮肤衣。
\(LSZ\)从某天起(该天算作第\(1\)天)穿上\(N\)件皮肤衣(刚开始所有皮肤衣都是不透明的),问你最少要经过多少天,\(LSZ\)身上的皮肤衣都经历过透明变化?
例如今天(公元\(2018\)年\(6\)月\(17\)日)\(LSZ\)穿了\(3\)件皮肤衣服,会在公元\(2018\)年\(6\)月\(21\)日\(3\)件皮肤衣都会经历过透明变化。
输入格式
一行,只有一个整数\(N\)。
输出格式
最少的天数(对\(N\)取余数)
样例
样例输入1
3
样例输出1
2
样例1解释
使用\(0\)代表皮肤衣透明状态。
使用\(1\)代表皮肤衣不透明的状态。
\(5\)对\(3\)取余数为\(2\)。
样例输入2
5
样例输出2
2
数据范围与提示
\(20\%\)的数据:\(N \le 15\)
\(60\%\)的数据:\(N \le 10^7\)
\(100\%\)的数据:\(N \le 10^{10}\)
分析
看到这个题目一开始是没有思路的,但是可以手模一到两个小数据,然后就会发现,其实这个答案是有规律的。假设\(i\)件,\(g[i]\)为答案,那么手模几个可以发现这个题的规律跟汉诺塔差不多,即\(g[i] = 2\times g[i-1]+1\),相信能做这种题的数列都学过,推个通项公式嘤该没问题(好懒……),最后可以推出来答案应该是\(2^n-1\)。
但是看到数据范围,\(N \le 10^{10}\),开玩笑??所以我们需要快速幂并取模。其实就是个板子,推出来公式就很好写了。
代码
#include<bits/stdc++.h>
#define ll unsigned long long
ll n;
ll pow(ll a,ll b){//注意如果using namespace std了,并且用的万能库,函数名千万别用pow,有冲突但不报错,我就是这么挂的……
ll ans = 1;//这块就是快速幂板子
ll base = a%n;
while(b){
if((b & 1) !=0){
ans = (ans*base)%n;
}
base = (base*base)%n;
b>>=1;
}
return ans;
}
int main(){//求值,注意过程取模
std::cin>>n;
ll ans = pow(2,n-1);
ll jl = (ans+1)%n;
std::cout<<jl<<std::endl;
}