FJNU - 第二十一届低编赛题解

题目链接:点击打开链接


A:

题意:题意很清楚了,就不解释了。

解题思路:很容易发现这个题目其实跟01排列顺序没有关系长度才是关键,就比如要求步数相同的情况下1001和0000,1111答案数是一样的,这个想一想就很好理解了。

接下来代码有注释说明。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector> 
#define M 100005
using namespace std;
typedef long long ll;
const int mx = 1e3+10;
const ll mod = 2e9+14;//因为下面答案要除以二所以我们这里取模要乘以2 
int n,m,ans;
ll dp[mx][mx];//dp[i][j]表示到达字符串i位置用了j步的方法数 
char str[mx];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        memset(dp,0,sizeof(dp));
        dp[0][0] = 2;//讲道理dp[0][0]应该是0,但这样dp就无法实现了
		//所以我们假设在0处放1或0,那么等下就将答案除以二就行了 
        scanf("%d%s",&n,str);
        int len = strlen(str);
        //那么发现没到len之前我们只能按照他所需要的去取,不然你取不一样的你需要删除啊
		//那万一你后面步数不够怎么办,这里我们就运用了近似回溯的办法解决这个问题
		//那就是要是可以运用删除回到最初起点,那么删除的那个点不就0和1可以随便取吗。
		//这就包括了后面长度已经超过len了就可以随便取0和1了
		
		//那么转移方程不就是前一个的状态+后一个状态*2,因为后面满足删除条件就可以01随便取 
        for(int j=1;j<=n;j++){ 
            for(int i=0;i<=j;i++){
                if(i==0)
                {
                    dp[i][j]= (2*dp[i+1][j-1]+dp[i][j-1])%mod;
                    continue;
                }
                dp[i][j] = dp[i-1][j-1]; 
                if(i+1<j) dp[i][j] = (dp[i][j]+2*dp[i+1][j-1])%mod;
                //满足可以任意取得条件就乘2啊~ 
            }
        } 
        //二维的下标最多只能取n及以下不然后面的答案是错,因为前面的串是不确定的。 
        printf("%lld\n",dp[len][n]/2);
    }
    return 0;
}


B:
解题思路:从前扫一次,从后扫一遍,最后都除以最大公约数就行了,其实很容易发现任意两个连续的点如果是RL结构那么这两点肯定是不行的啊。

#include<cstdio>
#include<cstring>
#include<iostream>
#define M 100005
using namespace std;
const int mx = 1e3+10;
char str[mx];
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",str+1);
        int len = strlen(str+1);
        int sum = 0;
        for(int i=1;i<=len;i++) 
        if(str[i]=='L') sum++;
		else break; 
        for(int i=len;i>=1;i--)
        if(str[i]=='R') sum++;
        else break;
        int Gcd = gcd(sum,len);
        printf("%d/%d\n",sum/Gcd,len/Gcd);
    }
    return 0;
}

C:题解:第一种:(错误解法,但是因为数据弱,也能AC)按照说真话的人去找到哪个人说了真话,直到找过的人超过总人数或者找的人说的话已经是真话了。然后暴力每个人,如果这个人指出的人说的是真话,那么这个人也标记说了真话。(可惜这个算法是错的)。

#include<cstdio>
#define M 100010
 
struct A
{
    int ans;
    bool flag;
}a[M];
 
int main()
{
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t++)
    {
        int n;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i].ans);
            a[i].flag = false;
        }
        int x;
        scanf("%d", &x);
        a[x].flag = true;
        int count = 1;
        int b = a[x].ans;
        while(count <= n)
        {
            if(a[b].flag)break;
            a[b].flag = true;
            b = a[b].ans;
            count++;
        }
        for(int i = 1; i <= n; i++)
        {
            if(a[a[i].ans].flag == true)a[i].flag = true;
        }
        int res = 0;
        for(int i = 1; i <= n; i++)
        {
            if(a[i].flag)res++;
        }
        printf("%d\n", res);
    }
    return 0;
}

第二种:建双向边,构图,然后搜索连通图

#include<cstdio>
#include<cstring>
#define M 100010

struct a
{
	int v;
	int next;
}e[M * 4];

int a[M], used[M], b[M];
int cnt;

void add(int u, int v)
{
	e[++cnt].v = v;
	e[cnt].next = b[u];
	b[u] = cnt;
}

void dfs(int u)
{
    used[u] = 1;
    for(int i = b[u]; i; i = e[i].next)
    {
        int v = e[i].v;
        if(!used[v])dfs(v);
    }
}

int main()
{
	int T;
	scanf("%d", &T);
	for(int t = 1; t <= T; t++)
	{
		memset(used, 0, sizeof(used));
		memset(b, 0, sizeof(b));
		cnt = 0;
		int n;
		scanf("%d", &n);
		for(int i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
			add(a[i], i);
			add(i, a[i]);
		}
		int x;
		scanf("%d", &x);
		dfs(x);
		int count = 0;
		for(int i = 1; i <= n; i++)
			if(used[i])count++;
		printf("%d\n", count);
	}
	return 0;
}

D:题解:每只老鼠对应着两种状态,生或者死,如果有n只老鼠,那么实验的结果就会有2的n次方种,然后每种结果即可对应到那瓶特殊药剂在特定的哪一个瓶子。那么至少需要的老鼠需满足2的n次方大于瓶子数。(这题目其实不需要我们去知道如何喂老鼠,模拟下就好了)

#include<cstdio>
 
int main()
{
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t++)
    {
        int n;
        scanf("%d", &n);
        int count = 0;
        n--;
        while(n)
        {
            n = n / 2;
            count++;
        }
        printf("%d\n", count);
    }
    return 0;
}
E:

题解:硬币只有正反两面,当有一种情况是妹子赢得时候,把所有硬币都反转的情况就是胖哥赢,所以,胖哥赢得概率是0.5

#include<cstdio>
 
int main()
{
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t++)
    {
        int n;
        scanf("%d", &n);
        printf("1/2\n");
    }
    return 0;
}
F:

题解:贪心法,把每个商品的性价比算出来,然后优先取大的,直到没钱了为止。

#include<cstdio>
#include<algorithm>
#define N 1010
using namespace std;
struct A
{
    int v;
    int p;
    double x;
}a[N];
 
bool cmp(A x,A y)
{
    return x.x>y.x;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n,m;scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i].p,&a[i].v);
            a[i].x=a[i].p*1.0/a[i].v;
        }
        sort(a,a+n,cmp);
        double sum=0.0;
        int i=0;
        while(m>0&&i<n)
        {
            if(m>=a[i].v)
            {
                sum+=a[i].p;
                m-=a[i].v;
            }
            else
            {
                sum+=(m*1.0)/a[i].v*a[i].p;
                m=0;
            }
            i++;
        }
        printf("%.4f\n",sum);
    }
    return 0;
}

G题解:我们就得求左边围栏到达第i个位置的最小值L[i],右边围栏到达第j的最大值R[j],

然后就是最大值的R[j]-L[i] (j>i);

保存一下a[i]的位置

现在我们就是如何求L[i],R[j]的问题了,题目要求左边的递减,右边的递增,那么我们先求L[i],先求L[i];我们先按a的数值从大到小排序,如果数值相同的话我们就先放位置更后面的a,然后就是求位置在它之前的L[i]的最小值加上他,或者不加,直接取本身值,然后将L[i]数值插入对应的位置,之后我们只要求a的位置到开头的最小值即可,求R[i]同理

这是因为求L[i]时数值比他小的不会做出贡献,当然数值跟他一样的我们也要确保不会做贡献所以在前面的后插入,那么我们用一个线段树维护最大值最小值即可

最后还有一个情况就是我们要求R[j]-L[i]得最大值我们不用一个一个试,我们可以预处理一下从1-i的L[i]最小值,j-m的R[j]最大值最后,一个位置一个位置的试然后枚举每个i

就是R[i]-L[i-1]中的最大值,同时我们左边右边可能不取围栏那么我的i的取值范围应该是[1,n+1]

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector> 
#include<set>
#include<algorithm>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int mx = 1e5+10;
int n,m;
struct data{
	int val,pos;
	bool operator < (data A)const
	{
		return val < A.val;
	}
}s[mx];
ll sum[mx<<2],front[mx],back[mx];
int po[mx];
ll query(int L,int R,int l,int r,int rt)
{
	if(L<=l&&R>=r) return sum[rt];
	int mid = (l+r)>>1;
	ll ans = 0;
	if(L<=mid) ans = query(L,R,lson);
	if(R>mid) ans = max(ans,query(L,R,rson));
	return ans;
}
void update(int M,ll v,int l,int r,int rt)
{
	if(l==r){
		sum[rt] = v;
		return ;
	}
	int mid = (l+r)>>1;
	if(M<=mid) update(M,v,lson);
	else update(M,v,rson);
	sum[rt] = max(sum[rt<<1],sum[rt<<1|1]);
}
int num[mx];
void newpoint(int x,ll *p)
{
	if(num[x]<=0) p[x] = 0;
	else{
		if(po[x]==m) p[x] = num[x];
		else{
			ll ret = query(po[x]+1,m,1,m,1);
			p[x] = ret + num[x];
		}
		update(po[x],p[x],1,m,1);
	}	
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
    	scanf("%d",&n);
    	memset(sum,0,sizeof(sum));
    	for(int i=1;i<=n;i++){
    		scanf("%d",&s[i].val);
    		num[i] = s[i].val;
    		s[i].pos = i;
		}
		sort(s+1,s+1+n);
		back[n+1] = 0;
		m = po[s[1].pos] = 1;
		for(int i=2;i<=n;i++){
			if(s[i].val!=s[i-1].val) m++;
			po[s[i].pos] = m;
		}
		ll ans = 0;
		for(int i=n;i>=1;i--) newpoint(i,back);
		for(int i=n;i>=1;i--) back[i] = max(back[i],back[i+1]);
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=n;i++) num[i] = -num[i],newpoint(i,front);
		for(int i=1;i<=n;i++) front[i] = max(front[i],front[i-1]);
		for(int i=0;i<=n;i++) ans = max(ans,front[i]+back[i+1]);
		printf("%lld\n",ans);
	}
    return 0;
}



H题解:我们矩阵快速幂求解,但是今天教的是另外一种做法,先求所有的a[n]每100W个存一次然后求好放到文件里面,把这些答案复制放到数组里面,那么我们每次只要判断n在哪个100W里面就可以了

预处理代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long int ll;
const int mod = 1e9+7;
int main(){
    freopen("out.txt","w",stdout);
    ll a = 1,b = 1,c;
    printf("1,1");
    for(int i = 1; i <= 666; i++){
        for(int j = 1; j <= 1000000; j++){
            c = (3*a+2*b)%mod;
            a = b;
            b = c;
        } 
        printf(",%lld,%lld",a,b);
    }
    return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long int ll;
const int mod = 1e9+7;
ll f[][2] = {1,1,532467711,597403124,480917574,442752713,16497859,49493575,764311858,292935558,44455160,133365478,666361539,999084608,573281209,719843618,851784059,555352161,590121073,770363210,384673227,154019672,542640870,627922601,767646214,302938626,830222925,490668759,437322164,311966483,39464321,118392961,471957767,415873292,243665424,730996270,541700228,625100675,790377993,371133963,300211745,900635233,280309109,840927325,381004507,143013512,692258400,76775184,951845302,855535890,784198049,352594131,80884008,242652022,976225957,928677855,699132043,97396113,802614103,407842293,163249386,489748156,858483439,575450301,600919204,802757603,486676194,460028573,387648973,162946910,839757097,519271275,838955637,516866895,702415498,107246478,310896982,932690944,563735277,691205822,809687294,429061866,745920360,237761064,516104808,548314415,607808456,823425359,914315030,742945074,51404742,154214224,647499569,942498698,751049299,253147881,291119204,873357610,370295131,110885384,932884662,798653970,784711608,354134808,246928998,740786992,69026410,207079228,946440231,839320677,263570515,790711543,857445087,572335245,784393458,353180358,45109511,135328531,219150416,657451246,359150160,77450471,632047589,896142758,39653239,118959715,940413950,821241834,214694414,644083240,26520796,79562386,323346868,970040602,59739008,179217022,656807370,970422101,658183071,974549204,371532961,114598874,935833629,807500871,176388495,529165483,335017207,5051612,348919628,46758875,805837609,417512811,858425637,575276895,204145447,612436339,491898472,475695407,169228288,507684862,332401166,997203496,644732772,934198307,643657982,930973937,710533466,131600382,920125733,760377183,453699544,361098623,982555344,947666016,61466247,184398739,635564203,906692600,824022971,472068897,860369387,581108145,414224421,242673254,545792753,637378250,593698093,781094270,657633582,972900737,76079282,228237844,106443365,319330093,392976799,178930388,424365306,273095909,106984622,320953864,140106168,420318502,426880885,280642646,269655878,808967632,420424277,261272822,759075007,277225005,959094252,877282740,350218351,50655044,920923600,762770784,277298812,831896434,500414874,501244613,255017604,765052810,44642635,133927903,433015971,299047904,616202794,848608373,723785332,171355980,319084645,957253933,846611076,539833212,799752481,399257427,555268625,665805866,260721861,782165581,331907177,995721529,264730865,794192593,664552551,993657644,189402446,568207336,625062459,875187368,734434500,203303484,447079641,341238914,843619564,530858676,730906298,192718878,191137748,573413242,178058706,534176116,177010369,531031105,980380376,941141112,614938126,844814369,984207634,952622886,195913263,587739787,219476216,658428646,316883268,950649802,520746627,562239872,44176589,132529765,543274768,629824295,196421845,589265533,201967989,605903965,356190618,68571845,548372454,645117353,544956709,634870118,730815900,192447684,159624066,478872196,205048836,615146506,430205884,290617643,454759094,364277273,299977423,899932267,484336313,453008930,247266826,741800476,69913643,209740927,788206402,364619190,140575162,421725484,746221223,238663653,179430331,538290991,213614650,640843948,104649305,313947913,364951445,94854326,472617616,417852839,811357981,434073927,497170369,491511098,981092322,943276950,122870153,368610457,664980271,994940804,364484108,93452315,751257527,253772565,662410949,987232838,377882680,133648031,564996041,694988114,41410507,124231519,864704139,594112401,327961396,983884186,343736078,31208225,842954081,528862227,317093827,951281479,256487342,769462024,89476101,268428301,88401935,265205803,674975475,24926409,69695263,209085787,192596342,577789024,582643624,747930863,141593198,424779592,334885378,4656125,978287349,934862031,41131325,123393973,66079687,198239059,269831331,809493991,533537068,600611195,619940299,859820888,156588523,469765567,965008839,895026501,503013907,509041712,537690883,613072640,314756599,944269795,389757333,169271990,68259781,204779341,575289292,725867867,551822649,655467938,384094159,152282468,522589932,567769787,816641994,449925966,66504911,199514731,366120783,98362340,919222031,757666077,190607690,571823068,642625634,927876893,766230646,298691922,336741213,10223630,391484469,174453398,358669021,76007054,672109744,16329216,642100245,926300726,414243412,242730227,734231396,202694172,804846908,414540708,279290740,837872218,168847637,506542909,602299678,806899025,136754936,410264806,791074135,373222389,568868105,706604306,118524965,355574893,85267531,255802591,855016957,565050855,158701335,476104003,285972628,857917882,329392032,988176094,284029089,852087265,820685321,462055947,177349404,532048210,358311754,74935253,391718599,175155788,687042420,61127244,133500489,400501465,929267380,787802124,82131083,246393247,307073147,921219439,256680701,770042101,936103842,808311510,569288855,707866556,693774218,81322638,220534937,661604809,802847526,408542562,582285409,746856218,302430015,907290043,560114581,680343734,417604927,252814772,100895632,302686894,56382045,169146133,876145590,628436754,680206425,40619259,971180852,913542540,719576815,158730429,527276581,581829734,307599370,922798108,764802833,294408483,709120643,127361913,674354205,23062599,645321884,935965643,875002572,625007700,333686527,1059572,92822964,278468890,21386907,64160719,118035419,354106255,213308010,639924028,309439729,928319185,237539924,712619770,666027562,998082677,638671540,916014611,37143050,111429148,779621704,338865096,225782347,677347039,541240065,623720186,915674678,747024018,356560991,69682964,872293526,616880562,311362874,934088620,453422794,360268373,106856634,320569900,186397313,559191937,70948370,212845108,213858043,641574127,929758379,789275121,305246488,915739462,399109180,197327531,120618577,361855729,646291256,938873759,446701951,340105844,387277579,161832728,216778793,650336377,38871252,116613754,291181778,873545332,638862326,916586969,804951738,414855198,458692711,376078124,346601844,39805523,543288575,629865716,759676671,279029997,259749658,779248972,928052052,784156140,255857717,767573149,129722546,389167636,638211232,914633687,746804775,240414309,369875608,109626815,33387827,100163479,821161311,463483917,784842908,354528708,266727516,800182546,22943487,68830459,284052000,852155998,555945059,667835168,782248069,346744191,323178649,969535945,689407810,68223414,711346770,134040294,151703898,455111692,820619384,461858136,530986460,592959371,834667962,504003870,753142002,259425990,825852016,477556032,653837627,961512872,168354356,505063066,196570561,589711681,136928814,410786440,630910590,892731761,539387477,618162422,347765332,43295987,117723743,353171227,403355819,210067448,380261824,140785463,264520220,793560658,344366267,33098792,426280873,278842610,242303644,726910930,794242304,382726896,933064989,799194951,393030016,179090039,92267952,276803854,87644219,262932655,73165465,219496393,194552597,583657789,810068984,430206936,943916525,831749559,370793377,112380122,742942028,228826068,296009153,888027457,230826300,692478898,715198890,145596654,156930605,470791813,201145289,603435865,991466779,974400321,778474668,335423988,968770831,906312477,9288586,27865756,640694795,922084376,937275960,811827864,536342923,609028760,974713876,924141612,94082818,282248452,161883800,485651398,966841560,900524664,999062345,997187019,997796445,993389319,257789252,773367754,153725061,461175181,875867151,627601437,128594239,385782715,556560003,669680000,425195361,275586074,71675092,215025274,207460621,622381861,686563604,59690796,18528309,55584925,874745222,624235650,205010604,615031810,819475217,458425635,573676401,721029194,807733913,423201723,142873527,428620579,27974611,83923831,401590450,204771341,414186503,242559500,324781935,974345803,728849444,186548316,526045133,578135390,722459653,167378943,804991127,414973365,199696851,599090551,70941825,212825473,211576388,634729162,718765329,156295971,348280235,44840696,556964540,670893611,202584796,607754386,973813352,921440040,195735214,587205640,534029864,602089583,531993843,595981520,666371619,999114848,122249744,366749230,149997947,449993839,186946102,560838304,911612571,734837697,758650118,275950338,616168336,848504999,179305379,537916135,403821320,211463951,880202649,640607931,484149722,452449157,883517971,650553897,289256056,867768166,84418747,253256239,714966193,144898563,881004824,643014456,49510542,148531624,987161776,961485312,628355255,885065756,804415311,413245917,349610764,48832283,7813753,23441257,749929316,249787932,731850331,195550977,364393303,93179900,291030529,873091585,222498987,667496959,201821467,605464399,889527115,668581329,539950230,619850681,946544280,839632824,728414509,185243511,841954744,525864216,955727560,867182664,812918189,438754551,248867290,746601868,861618257,584854755,304138929,912416785,597418194,792254573,954499434,863498286,943222268,829666788,505391553,516174650,963965576,891896712,788672240,366016704,523750351,571251044,104292989,312878965,838138587,514415745,222778183,668334547,909541708,728625108,413349140,240047411,812089278,436267818,570289918,710869745,133664265,400992793,791556199,374668581,594063480,782190431,213582711,640748131,132476077,397428229,312406452,937219354,622419731,867259184,98866350,296599048,790511708,371535108,139033974,417101920,66089930,198269788,403272278,209816825,610878825,832636466,595067164,785201483,849191669,547574991,673399979,20199921,585396061,756188174,776446006,329338002,962856887,888570645,609963945,829891826,483922700,451768091,116064050,348192148,552042328,656126975,330806410,992419228,504368680,513106031,282706094,848118280,593241754,779725253,95951660,287854978,190004910,570014728,874048708,622146108,780380411,341141217,178587176,535761526,595006737,785020202,996957359,990872061,861379057,584137155,753218860,259656564,631866291,895598864,379048278,137144825,153153790,459461368,157235622,471706864,606178685,818536046,60445639,181336915,33016402,99049204,185185187,555555559,167869176,503607526,832626583,497879733,963574002,890721990,769048593,307145763,890535383,671606133,839494878,518484618,539751160,619253471,253769782,761309344,207041523,621124567,384617530,153852581,834912631,504737877,435838752,307516247,67786035,203358103,682863789,48591351,1461642,4384924,795257701,385773087,157172795,471518383,908951867,726855585,844088080,532264224,11118954,33356860,343715155,31145456,199296465,597889393,840454021,521362047,887105388,661316148,695711044,87133116,817810525,453431559,110230592,330691774,544412302,633236897,437133859,311401568,376416647,129249932,105869758,317609272,985219237,955657695,55062082,165186244,532875892,598627667,882953973,648861903,845887252,537661740,988978359,966935061,196699890,590099668,169027234,507081700,807766202,423298590,842441501,527324487,722818702,168456090,800289208,400867608,144974632,434923894,150052029,450156085,23981466,71944396,879668499,639005481,233004417,699013249,643344269,930032798,627143881,881431634,732767102,198301290,268404780,805214338,854408392,563225160,738757051,216271137,83835946,251507836,291016487,873049459,399421983,198265940,112781835,338345503,563672242,691016717,605894455,817683356,467853618,403560845,631098273,893294810,812607930,437823774,452396093,357188270,852834110,558502314,86049885,258149653,335545892,6637667,728029908,184089708,616969748,850909235,198945667,596836999,627253102,881759297,43569945,130709833,864259903,592779693,679589621,38768847,548364360,645093071,957719475,873158409,637190577,911571722,92292537,276877609,524786237,574358702,790088938,370266798,394249365,182748086,23839185,71517553,804093838,412281498,367412067,102236192,979766657,939299955,517872424,553617263,483758013,451274030,97613490,292840468,808297153,424891443,365198869,95596598,52378683,157136047,909103442,727310310,429396229,288188678,172504949,517514845,669484423,8453253,337275683,11827040,421962107,265886312,386087607,158262812,892851289,678553851,153337267,460011799,312106702,936320104,232209479,696628435,15571270,46713808,324410188,973230562,183670159,551010475,198156237,594468709,663737916,991213739,528788849,586366538,55570922,166712764,268704358,806113072,75727506,227182516,386408002,159223997,874674184,624022536,323103163,969309487,974780920,924342744,623948563,871845680,437027873,311083610,131676617,395029849,46693403,140080207,901181754,703545246,343138183,294};
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int m = (n-1)/1000000;
        n -= m*1000000;
        if(n==1||n==2){
            printf("%lld\n",f[m][n-1]);
            continue;
        }
        n -= 2;
        ll a = f[m][0],b = f[m][1],c;
        for(int i = 1; i <= n; i++){
            c = (3*a+2*b)%mod;
            a = b;
            b = c;
        }
        printf("%lld\n",b);
    }
    return 0; 
} 
矩阵快速幂代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define M 100005
using namespace std;
typedef long long ll;
const int mx = 1e3+10,mod = 1e9+7;
int n,m;
struct node{
    ll ma[2][2];
};
const node base = {2,1,3,0};
node cheng(node A,node B)
{
    node c;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            c.ma[i][j] = 0;
            for(int k=0;k<2;k++)
            c.ma[i][j] = (c.ma[i][j]+A.ma[i][k]*B.ma[k][j]%mod)%mod;
        }
    }
    return c;
}
node kuaisu(int x){
    node ans = {1,1,0,0},ret = base;
    while(x){
        if(x&1) ans = cheng(ans,ret);
        x >>= 1;
        ret = cheng(ret,ret);
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        if(n<=2){
            puts("1");
            continue;
        }
        node ans = kuaisu(n-2);
        printf("%lld\n",ans.ma[0][0]);
    }
    return 0;
}











  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值