列表

详情


NC14351. 布置会场(II)

描述

小d接到了一个布置会场的任务。
他需要将贵宾观众席的椅子排成一排,一共需要N个。
上级领导指示,他只能使用两种椅子。(A类型和B类型)并且假设每种椅子的数量都是无限的。
而其如果想要摆置一个B类型的椅子,对应就需要必须有连续两个一起布置。换句话说,就是如果出现了B类型的椅子,其必须且只有两个连着B类型的椅子。
小d突然想知道对应N个椅子排成一列,他能够有多少种布置的方式.

输入描述

本题包含多组输入第一行输入一个整数t,表示测试数据的组数
每组测试数据包含一行,输入一个整数N,表示一共需要摆放的椅子数量
t<=1000
1<=N<=100000000000000000(10^18)

输出描述

每组测试数据输出包含一行,表示一共有多少种布置的方式,方案数可能会很大,输出对1000000007取摸的结果。

示例1

输入:

2
2
4

输出:

2
5

说明:

第一个样例,AA,BB两种方案。
第二个样例,AAAA,BBBB,AABB,ABBA,BBAA五种方案 对于ABBB 因为有连续3个B类型椅子所以不可行

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2023-03-11 10:46:56

#include <bits/stdc++.h>

using namespace std;

#define out(x) cout << #x << '=' << x << endl
#define out2(x, y) cout << #x << '=' << x << ',' << #y << '=' << y << endl 
#define no cout << "No" << endl; return
#define yes cout << "Yes" << endl; return
#define outvec(a) for (int v : a) { cout << v << ' '; } cout << endl
#define lowbit(x) (x & -x)
#define gcd __gcd 
#define inf 0x3f3f3f3f3f3f3f3fLL
#define infi 0x3f3f3f3f

using ll = long long;
using pii = pair<int, int>;

pair<ll, ll> fib(ll n) {
  if (n == 0) return {0, 1};
  auto p = fib(n >> 1);
  ll c = (p.first * ((2 * p.second - p.first + 1000000007) % 1000000007)) % 1000000007;
  ll d = (p.first * p.first + p.second * p.second) % 1000000007;
  if (n & 1)
    return {d, c + d};
  else
    return {c, d};
}

void solve() {
	ll n;
	cin >> n;
	
	cout << fib(n + 1).first << endl;
}




int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int t = 1;
    cin >> t;
    
    while (t--) {
		solve();
	}
}

C++(clang++11) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2021-02-08 14:43:48

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1e9+7;
struct mat{
    int a[2][2];
    mat(){memset(a,0,sizeof(a));}
    int *operator [](int x){return a[x];}
    mat operator * (mat b){
	mat c;
	for(int i=0;i<2;++i)
	    for(int j=0;j<2;++j)
		for(int k=0;k<2;++k)
		    c[i][k]=(c[i][k]+1ll*a[i][j]*b[j][k])%mod;
	return c;
    }
}S,T;
int main(){
    int kase;
    scanf("%d",&kase);
    while(kase--){
	long long n;
	scanf("%lld",&n);
	T[0][0]=0;T[0][1]=T[1][0]=T[1][1]=1;
	S[0][0]=S[0][1]=1;S[1][0]=S[1][1]=0;
	while(n){
	    if(n&1)S=S*T;
	    T=T*T;
	    n>>=1;
	}
	printf("%d\n",S[0][0]);
    }
}

上一题