UVA 1647 Computer Transformation
https://vjudge.net/problem/UVA-1647
题意:
开始有一个1,接下来每一步1变成01,0变成10
问n不之后00的个数
打表找规律
第3步之后:
如果第i步之后有x个字符,
那么第i+1步之后 的后x个字符与第i步一样
前x个字符是第i步取反
所以00得个数由三部分组成
1、上一步00的个数
2、上一步11的个数
3、当i为偶数时,前x个字符的最后一个是0,后x个字符的第一个是0,00个数+1
f[i][0]=f[i-1][0]+f[i-1][1]+!(i&1)
f[i][1]=f[i-1][0]+f[i-1][1]
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct BigInteger { int len; int num[10001]; BigInteger() { len=0; memset(num,0,sizeof(num));} BigInteger operator + (BigInteger p) const { BigInteger b; b.len=max(len,p.len); int x=max(len,p.len); for(int i=1;i<=x;i++) { b.num[i]+=num[i]+p.num[i]; b.num[i+1]=b.num[i]/10; b.num[i]%=10; } if(b.num[x+1]) x++; b.len=x; return b; } void operator = (BigInteger p) { this->len=p.len; for(int i=1;i<=len;i++) this->num[i]=p.num[i]; } void print() { for(int i=len;i;i--) printf("%d",num[i]); printf("\n"); } }; BigInteger f[1001][2]; BigInteger e; int main() { f[1][0].len=1; f[1][0].num[1]=0; f[2][0].len=1; f[2][0].num[1]=1; e.len=1; e.num[1]=1; for(int i=3;i<=1000;i++) { f[i][1]=f[i-1][0]+f[i-1][1]; if(i&1) f[i][0]=f[i-1][0]+f[i-1][1]; else f[i][0]=f[i-1][0]+f[i-1][1]+e; } int n; while(scanf("%d",&n)!=EOF) f[n][0].print(); }
分类:
其他——打表找规律
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端