您的位置:首页 > 其它

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]);
}
}
}


其实这个题可以用组合数,但高精乘高精相对难写、、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: