2017.4.21 2^k进制数 思考记录
2017-04-21 20:01
253 查看
题目很长很坑爹 读了半天才知道什么意思 原来是数位dp、、、
然而我第一次打时用滚动数组忘了消除上一维的影响 (本次不能调用本次)
然后还要用dt的高精 然后调试的时候查看里不能有赋值语句、、不然直接影响主程序、
另外压位是很麻烦的、、、 这个题高精要开到100,但不用压位也可以过、
码:
#include<iostream>
#include<cstdio>
using namespace std;
#include<cmath>
#define ll long long
ll f[2][600][150],qian[600][150],ans[150],w,k,shang,zui,now,i,j;
void gjj(int a,int b,int c)
{
ll jin=0,lin=0;
for(int i=1;i<=100;i++)
{
lin=jin;
jin=(qian[a+1][i]+f[b][c][i]+jin)/10;
qian[a][i]=(qian[a+1][i]+f[b][c][i]+lin)%10;
}
}
void fuzhi(int a)
{
for(int i=1;i<=100;i++)
f[now][a][i]=qian[a+1][i];
}
void gjj2(int a)
{
ll jin=0,lin=0;
for(int i=1;i<=100;i++)
{
lin=jin;
jin=(ans[i]+f[now][a][i]+jin)/10;
ans[i]=(ans[i]+f[now][a][i]+lin)%10;
}
}
int main()
{
scanf("%lld%lld",&k,&w);
ll wei=w/k;
if(w%k)wei++,zui=pow(2,w%k);
shang=pow(2,k);
for(i=1;i<shang;i++)
{
f[now][i][1]=1;
}
now^=1;
for(i=2;i<=wei;i++,now^=1)
{ //cout<<shang<<" ";
if(i!=wei||!zui)
{
for(j=shang-1;j>=1;j--)gjj(j,now^1,j);//qian[j]=qian[j+1]+f[now^1][j];
for(j=1;j<shang;j++)
fuzhi(j),gjj2(j);//f[now][j]=qian[j+1];ans+=f[now][j]
}else
{
for(j=shang;j>=1;j--)gjj(j,now^1,j);
for(j=1;j<zui;j++)
fuzhi(j),gjj2(j);
}
}
bool flag=0;
for(i=100;i>=1;i--)
{
if(flag){printf("%lld",ans[i]);continue;}
if(ans[i])
{
flag=1,printf("%lld",ans[i]);
}
}
}
其实这个题可以用组合数,但高精乘高精相对难写、、
然而我第一次打时用滚动数组忘了消除上一维的影响 (本次不能调用本次)
然后还要用dt的高精 然后调试的时候查看里不能有赋值语句、、不然直接影响主程序、
另外压位是很麻烦的、、、 这个题高精要开到100,但不用压位也可以过、
码:
#include<iostream>
#include<cstdio>
using namespace std;
#include<cmath>
#define ll long long
ll f[2][600][150],qian[600][150],ans[150],w,k,shang,zui,now,i,j;
void gjj(int a,int b,int c)
{
ll jin=0,lin=0;
for(int i=1;i<=100;i++)
{
lin=jin;
jin=(qian[a+1][i]+f[b][c][i]+jin)/10;
qian[a][i]=(qian[a+1][i]+f[b][c][i]+lin)%10;
}
}
void fuzhi(int a)
{
for(int i=1;i<=100;i++)
f[now][a][i]=qian[a+1][i];
}
void gjj2(int a)
{
ll jin=0,lin=0;
for(int i=1;i<=100;i++)
{
lin=jin;
jin=(ans[i]+f[now][a][i]+jin)/10;
ans[i]=(ans[i]+f[now][a][i]+lin)%10;
}
}
int main()
{
scanf("%lld%lld",&k,&w);
ll wei=w/k;
if(w%k)wei++,zui=pow(2,w%k);
shang=pow(2,k);
for(i=1;i<shang;i++)
{
f[now][i][1]=1;
}
now^=1;
for(i=2;i<=wei;i++,now^=1)
{ //cout<<shang<<" ";
if(i!=wei||!zui)
{
for(j=shang-1;j>=1;j--)gjj(j,now^1,j);//qian[j]=qian[j+1]+f[now^1][j];
for(j=1;j<shang;j++)
fuzhi(j),gjj2(j);//f[now][j]=qian[j+1];ans+=f[now][j]
}else
{
for(j=shang;j>=1;j--)gjj(j,now^1,j);
for(j=1;j<zui;j++)
fuzhi(j),gjj2(j);
}
}
bool flag=0;
for(i=100;i>=1;i--)
{
if(flag){printf("%lld",ans[i]);continue;}
if(ans[i])
{
flag=1,printf("%lld",ans[i]);
}
}
}
其实这个题可以用组合数,但高精乘高精相对难写、、
相关文章推荐
- 2017.4.21 螺旋矩阵 思考记录
- 关于进制的一些思考
- noip2006 2^k进制数
- 以求知心记录,以勤奋心思考,以坦诚心求教,以平常心成长,欢迎大家来指点我成长~
- 解决nginx在记录post数据时 中文字符转成16进制的问题【转载】
- js 进制相关 记录
- 面向对象分析与设计思考和记录
- 2017.3.18 糖果 思考记录
- 各省省选题思考记录
- innodb 物理行格式 compressed (怎么16进制中找不到最大最小伪记录)
- 工作快两年思考记录
- noip2006 2^k进制数 (组合数学)
- [最不熟的两个东西]2^k进制数
- 2017.6.23 染色 思考记录
- Lucene.net(4.8.0) 学习问题记录四: IndexWriter 索引的优化以及思考
- 2017.4.16 级数求和 思考记录
- usaco题思考记录
- DRML(2016-CVPR)重现过程记录---(6)新的尝试与思考-tensorflow?
- 2017.5.12 校门外的区间 思考记录
- 2017.10.7 最长上升子序列 思考记录