傳送門:求和
解析:
考慮在1-n的位置上放第一個1,假設第i個位置放第一個1,這樣的數有:n-i個(後面 n-1 位放1或放0),答案是lowbit(i)之和,那麼一個第一1在i的數對答案的一個貢獻就是i-1 那麼所有的第i個數貢獻就是n-1,n個位置的所有貢獻就是:n-1,的1在第n+1位,那麼貢獻就是. 答案就是:n-1.
代碼:
#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;
}