SOJ 2785_Binary Partitions
2024-09-29 22:49:28
【题意】将一个数用二进制数表示,求一共有多少种表示方法。
【分析】思路一:完全背包
【代码】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
#include<ctime>
using namespace std;
const int INF=0x3fffffff,maxn=1e5+40;
const int mod=1000000;
const int total=2000050;
int f[total];
int main (void)
{
int T,temp;
f[0]=1;
scanf("%d",&T);
for(int i=0;i<=20;i++)//2^20<total<2^21
for(int j=(1<<i);j<total;j++)
f[j]+=f[j-(1<<i)]%mod;
while(T--)
{
scanf("%d",&temp);
printf("%d\n",f[temp]%mod);
}
}
代码在zoj上AC,但是在soj上就一直TLE,改了好久才勉强AC........渣哭
思路二:看了别人的博客,可以用递推思想,从二进制数的角度,任何一个数都可以由他前一个数+1表示,但如果该数n是偶数,那么他还可以由他的一半n/2表示,即将n/2左移一位
【代码】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
#include<ctime>
using namespace std;
const int INF=0x3fffffff,maxn=1e5+40;
const int mod=1000000;
const int total=2000050;
int f[total];
int main (void)
{
int T,num;
f[0]=1;
for(int i=0;i<total;i++)
{
if(i%2==0)
f[i]=(f[i/2]+f[i-1])%mod;
else
f[i]=f[i-1]%mod;
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&num);
printf("%d\n",f[num]);
}
}
最新文章
- Floyd-Warshall 全源最短路径算法
- Linux C fcntl()函数详解
- Web前端面试题目汇总
- Java设计模式-工厂方法模式(Factory Method)
- Redis安装及基本配置
- hexo资源--theme等
- QT的父子Widget之间消息的传递(如果子类没有accept或ignore该事件,则该事件会被传递给其父亲——Qlabel与QPushButton的处理就不一样)
- 我的VSTO之路(四):深入介绍Word开发
- 基于M9K块配置ROM的LCD12864图片显示实验
- 刨根问底HTTP和WebSocket协议
- VIM新手福利,配置向
- 信用评分卡 (part 4 of 7)
- 1021. Remove Outermost Parentheses删除最外层的括号
- pl/sql破解方法
- Spark MLlib 之 StringIndexer、IndexToString使用说明以及源码剖析
- day25
- discuz伪静态设置
- Eclipse搭建Android开发环境(安装ADT,Android4.4.2)
- hd acm 1297
- 搭建服务与负载均衡的客户端-Spring Cloud学习第二天(非原创)