二進制題

傳送門:求和

在這裏插入圖片描述

解析:

考慮在1-n的位置上放第一個1,假設第i個位置放第一個1,這樣的數有:22n-i個(後面 n-1 位放1或放0),答案是22lowbit(i)之和,那麼一個第一1在i的數對答案的一個貢獻就是22i-1 那麼所有的第i個數貢獻就是22n-1,n個位置的所有貢獻就是:n2n*2n-12n2^n的1在第n+1位,那麼貢獻就是2n2^n. 答案就是:n2n*2n-1+2n+2^n.

代碼:

#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
int read(long long &x){
	long long s=0,w=1;
	char c=getchar();
	if(c=='-') w=-1,c=getchar();
	while(c<='9'&&c>='0') s=s*10+c-'0',c=getchar();
	x=s*w;
}
long long  qp(long long  x,long long  y){
	long long  ans=1,tmp=x;
	while(y){
		if(y&1) ans=(ans%mod*tmp%mod)%mod;
		tmp=(tmp%mod*tmp%mod)%mod;
		y/=2;
	}
	return ans;
}
int main(){
	long long T;
	read(T);
	while(T--){
		long long n;
		read(n);
		long long n1=qp(2,n-1);
		long long n2=qp(2,n);
		printf("%lld\n",(((n%mod)*(n1%mod))%mod+n2)%mod);
	}
    return 0;
}

傳送門:解鎖專家

題意:統計n位01串,沒有連續1的可能有多少種(例如n=3,(011)不符合,(010)符合)。
解析:一位有0,1兩種,兩位有01,10,00兩種,三位有001,010,000,100,101。可以發現三位的前三個是通過兩位的所有可能的首位加0得到的,後面兩個是通過在一位的第三位加1得到的。所以這是一個斐波那契,題目不允許可能位全0串,所以要再-1.

#include<bits/stdc++.h>
using namespace std;
const int mod=433494437;
long long p[110];
int main(){
    long long n,ans=1;
    p[0]=0;
    p[1]=2;p[2]=3;
    for(int i=3;i<=110;++i){
        p[i]=(p[i-1]+p[i-2])%mod;
    }
    while(cin>>n){
        cout<<(p[n]-1+mod)%mod<<endl;//當p[n]=0時如果不+mod答案會爲負數,難怪Mod數不是1e9+7
    }
     
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章