集训模拟赛3【啥也不会的一天】

前言

今天\(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;
}

猜你喜欢

转载自www.cnblogs.com/Vocanda/p/13209897.html