看完题目想必大家都明白了 这个数组里面只有0/1
**所以大家应该能够想到 当 1 的个数为奇数时 是不是残骸就为 1 了
所以聪明的你肯定能够想到 每一个 1 的位置都是随机的 所以我们需要考虑每一个 1 在长度为n的数组里面的位置问题
所以聪明的你肯定又能想到高中学习的排列组合 又因为是组合问题 所以聪明的你肯定能够知道是C几几的问题
所以聪明的你肯定想到了直接求的方法**
链接 https://ac.nowcoder.com/acm/contest/122913/B
#defime ll long long
ll ksm(int x,int y){
ll res=1;
while(y){
if(y&1) res=res*x%mod; //判断y的奇偶
x=x*x%mod;
y>>=1; // 等同于y/=2;
}
}
ll inv(int x){
return ksm(x,mod-2);
}
ll C(int x;int y){
ll res=1;
for(ll i=x;i>=x-y+1;i--) res=res*i%mod;
for(ll j=1;j<=y;j++) res=res*inv(j)%mod;
return res;
}
void solve(){
ll n,sum=0;
cin>>n;
for(int i=1;i<=n;i+=2){
sum+=C(n,i);
}
cout<<sum<<"\n";
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin>>T;
while(T--){
solve();
}
}
聪明的你写完这串代码 高高兴兴的过了样例 兴高采烈的交了上去 然后发现它转了很久 你以为是你的电脑卡了然后刷新了一下页面重新弄提交了一下 结果还是一直转 所以 你就等了几十秒 结果弹出来一个运行超时(10001ms)
所以聪明的你开始思考你这串“完美”的代码哪里出了问题 到底是哪里出了问题呢?
想了很久 聪明的人终于想到 多次调用C使得运行时间过长 所以 聪明的你想到了预处理
所以你又写下了:
#define ll long long
ll ksm(ll x,ll y){
ll res=1;
x%=mod;
while(y){
if(y&1) res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
ll inv(ll x){
return ksm(x,mod-2);
}
ll fz[N],fm[N];
void iint(){
ll w=N-10;
fz[0]=fm[0]=1;
for(ll i=1;i<=w;i++){
fz[i]=fz[i-1]*i;
fz[i]%=mod;
}
fm[w]=inv(fz[w]);
for(ll i=w-1;i>=1;i--){
fm[i]=fm[i+1]*(i+1);
fm[i]%=mod;
}
}
ll C(ll n,ll m){
if(n<m) return 0;
return fz[n]*fm[m]%mod*fm[n-m]%mod;
}
void solve(){
cin>>n;
ll sum=0;
for(int i=1;i<=n;i+=2){
sum+=C(n,i)%mod;
}
cout<<sum%mod<<"\n";
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
iint();
int T;
cin>>T;
while(T--){
solve();
}
}

京公网安备 11010502036488号