P1028 数的计算
-
- 23.5K通过
- 47.4K提交
- 题目提供者CCF_NOI
- 评测方式云端评测
- 标签NOIp普及组2001(或之前)
- 难度普及-
- 时空限制1000ms / 128MB
提交 题解
- 提示:收藏到任务计划后,可在首页查看。
最新讨论显示
推荐的相关题目显示
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数nn):
先输入一个自然数nn(n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
11个自然数nn(n \le 1000n≤1000)
输出格式:
11个整数,表示具有该性质数的个数。
输入输出样例
输入样例#1: 复制
6
输出样例#1: 复制
6
说明
满足条件的数为
6,16,26,126,36,136
思路:
这个题的表述感觉很别扭,我也说不太清楚,直接说思路吧
对于一个数延伸出来的数,我们其实是不用加上原来的数再操作的,于是我们可以得出dp方程:
f[ x ] = 1;
for (int j = 1;j <= x / 2;j ++)
f[x] += f[j];
特别的,f [ 1] = 1;
代码:
#include<bits/stdc++.h>
using namespace std;
int f[1010];
void init()
{
f[1] = 1;
for (int i = 2;i <= 1000;i ++)
{
f[i] = 1;
for (int j = 1;j <= i / 2;j ++)
f[i] += f[j];
}
}
int main()
{
init();
int n;
scanf("%d",&n);
printf("%d\n",f[n]);
return 0;
}
P1149 火柴棒等式
-
- 16.6K通过
- 31.7K提交
- 题目提供者CCF_NOI
- 评测方式云端评测
- 标签NOIp提高组2008
- 难度普及-
- 时空限制1000ms / 128MB
提交 题解
- 提示:收藏到任务计划后,可在首页查看。
最新讨论显示
推荐的相关题目显示
题目描述
给你n根火柴棍,你可以拼出多少个形如“A+B=CA+B=C”的等式?等式中的AA、BB、CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00)。用火柴棍拼数字0-90−9的拼法如图所示:
注意:
-
加号与等号各自需要两根火柴棍
-
如果A≠BA≠B,则A+B=CA+B=C与B+A=CB+A=C视为不同的等式(A,B,C>=0A,B,C>=0)
-
nn根火柴棍必须全部用上
输入输出格式
输入格式:
一个整数n(n<=24)n(n<=24)。
输出格式:
一个整数,能拼成的不同等式的数目。
输入输出样例
输入样例#1: 复制
14
输出样例#1: 复制
2
输入样例#2: 复制
18
输出样例#2: 复制
9
说明
【输入输出样例1解释】
22个等式为0+1=10+1=1和1+0=11+0=1。
【输入输出样例2解释】
99个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
思路:
蒟蒻表示........暴力嘛(嘻嘻嘻)
代码:
#include<bits/stdc++.h>
using namespace std;
int num[10] = {6,2,5,5,4,5,6,3,7,6};
int solve(int x)
{
int res = 0;
if (!x)
res = 6;
while (x)
{
res += num[x % 10];
x /= 10;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
n -= 4;
int ans = 0;
for (int i = 0;i <= 1000;i ++)
{
for (int j = 0;j <= 1000;j ++)
{
int t = i + j;
if (solve(t) + solve(i) + solve(j) == n)
ans ++;
}
}
printf("%d\n",ans);
return 0;
}
P1036 选数
-
- 17.8K通过
- 40.3K提交
- 题目提供者CCF_NOI
- 评测方式云端评测
- 标签NOIp普及组2002
- 难度普及-
- 时空限制1000ms / 128MB
提交 题解
- 提示:收藏到任务计划后,可在首页查看。
最新讨论显示
推荐的相关题目显示
题目描述
已知 nn 个整数 x_1,x_2,…,x_nx1,x2,…,xn,以及11个整数kk(k<nk<n)。从nn个整数中任选kk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为:
3+7+12=223+7+12=22
3+7+19=293+7+19=29
7+12+19=387+12+19=38
3+12+19=343+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=293+7+19=29。
输入输出格式
输入格式:
键盘输入,格式为:
n,kn,k(1 \le n \le 20,k<n1≤n≤20,k<n)
x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1,x2,…,xn(1≤xi≤5000000)
输出格式:
屏幕输出,格式为: 11个整数(满足条件的种数)。
输入输出样例
输入样例#1: 复制
4 3 3 7 12 19
输出样例#1: 复制
1
思路:
dfs的01搜索
代码:
#include<bits/stdc++.h>
using namespace std;
int a[30];
int n,k,ans = 0;
bool judge(int x)
{
for (int i = 2;i <= sqrt(x);i ++)
if (x % i == 0)
return 0;
return 1;
}
void dfs(int sum,int num,int pos)//当前和为sum,num总个数,pos当前位置
{
if (pos == n + 1 || num == k)
{
if (judge(sum) && num == k)
ans ++;
return ;
}
dfs(sum,num,pos + 1);
dfs(sum + a[pos],num + 1,pos + 1);//选与不选
}
int main()
{
scanf("%d %d",&n,&k);
for (int i = 1;i <= n;i ++)
scanf("%d",&a[i]);
dfs(0,0,1);
printf("%d\n",ans);
return 0;
}
P1217回文质数
-
- 12.3K通过
- 50.8K提交
- 题目提供者FarmerJohn2
- 评测方式云端评测
- 标签USACO高性能
- 难度普及-
- 时空限制1000ms / 128MB
提交 题解
- 提示:收藏到任务计划后,可在首页查看。
最新讨论显示
推荐的相关题目显示
题目描述
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;
输入输出格式
输入格式:
第 1 行: 二个整数 a 和 b .
输出格式:
输出一个回文质数的列表,一行一个。
输入输出样例
输入样例#1: 复制
5 500
输出样例#1: 复制
5
7
11
101
131
151
181
191
313
353
373
383
说明
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
USACO Training Section 1.5
产生长度为5的回文数:
for (int i = 1;i <= 9;i ++)
for (int j = 0;j <= 9;j ++)
for (int k = 0;k <= 9;k ++)
{
int t = i * 10000 + j * 1000 + k * 100 + j * 10 + i;
if (t >= a && t <= b && judge(t))
printf("%d\n",t);
}
思路:
首先,偶数位的回文数不是质数(除11外),然后我们打一个1e4的素数的表用来判断是否是素数,这样我们就可以暴力求了
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4;
bool check[maxn + 10];
int prime[1500];
int pos = 0;
void init()
{
memset(check,0,sizeof(check));
check[1] = 1;
for (int i = 2;i <= maxn;i ++)
if (!check[i])
{
prime[pos ++] = i;
for (int j = i + i;j <= maxn;j += i)
check[j] = 1;
}
}
int _count(int x)
{
int cnt = 0;
while (x)
{
cnt ++;
x /= 10;
}
return cnt;
}
bool judge(int x)
{
for (int i = 0;i < pos;i ++)
if (x % prime[i] == 0)
return 0;
return 1;
}
int a,b;
void solve(int digit)
{
if (digit == 1)
{
for (int i = a;i <= 9;i ++)
if (!check[i] && i <= b)
printf("%d\n",i);
}
else if (digit == 2 && 11 >= a && 11 <= b)
printf("11\n");
else if (digit == 3)
for (int i = 1;i <= 9;i ++)
{
for (int j = 0;j <= 9;j ++)
{
int t = i * 100 + j * 10 + i;
if (t >= a && t <= b && !check[t])
printf("%d\n",t);
}
}
else if (digit == 5)
for (int i = 1;i <= 9;i ++)
for (int j = 0;j <= 9;j ++)
for (int k = 0;k <= 9;k ++)
{
int t = i * 10000 + j * 1000 + k * 100 + j * 10 + i;
if (t >= a && t <= b && judge(t))
printf("%d\n",t);
}
else if (digit == 7)
for (int i = 1;i <= 9;i ++)
for (int j = 0;j <= 9;j ++)
for (int k = 0;k <= 9;k ++)
for (int h = 0;h <= 9;h ++)
{
int t = i*1000000+j*100000+k*10000+h*1000+k*100+j*10+i;
if (t <= b && t >=a && judge(t))
printf("%d\n",t);
}
else ;
}
int main()
{
init();
scanf("%d %d",&a,&b);
int x = _count(a),y = _count(b);
x -= x == 9 ? 1 : 0,y -= y == 9 ? 1 : 0;
for (int i = x;i <= y;i ++)
solve(i);
return 0;
}