2 条题解
-
2
细胞分裂 题解
看图:

统计,找规律:

易得:每一个时间对应的红球排列都应被分成两部分(即红线处分割) 上半部分的每一排都是上一个小时的*2 ,下半部分直接把上个小时的移过来。

先预处理k小时后总共有多少个红球(总数!一大块里的“总”红球数!),每个小时一个红球变三个,所以共3^k个 把上面分析时两部分翻译一下:
定义一个函数dfs(nn,kk),表示第k/小时,1~nn红球的总数 1.上半部分(即nn<=2^(k-1)) 返回dfs(nn,kk-1)*2
2.下半部分 返回dfs(nn-2^(k-1),k-1)
注意!边界!
CODE
#include<bits/stdc++.h> #define int long long using namespace std; int t,k,a,b,cnt,sum_red[50]; int dfs(int nn,int kk){ if(nn<=0)return 0; if(kk<=0)return 1; if(nn<=(1<<kk-1))return dfs(nn,kk-1)<<1; return dfs(nn-(1<<(kk-1)),kk-1)+(sum_red[kk]<<1); } signed main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>t; sum_red[1]=1; for(int i = 2;i<=31;i++)sum_red[i]=sum_red[i-1]*3; while(t--){ cin>>k>>a>>b; cnt++; cout<<(dfs(b,k)-dfs(a-1,k))<<'\n'; } return 0; }
信息
- ID
- 322
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 19
- 已通过
- 7
- 上传者