自然数

洛谷P1028数的计算

£可爱£侵袭症+ 提交于 2020-01-23 02:32:12
题目描述: 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3.加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入: 6 输出 6 个人思路: 基本思路是递归应该没啥好说的。但是提交过程中有这样的情况: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; long long ans = 0; void judge(int k){ if(k != 0){ for(int i = k;i > 0;i--){ ans++; judge(i/2); } } else return; } int main() { int n; cin >> n; int k = n / 2; judge(k); cout << ans + 1 << endl; return 0; } 这样暴力遍历枚举的话大概500可以过,但是题目给了1000…所以前五个数据AC后面就全给T了。 AC代码: #include<iostream> #include<cstring> #include<cstdio>

C程序-PAT-1087 有多少不同的值

人走茶凉 提交于 2020-01-22 06:58:52
当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x的最大自然数,即 x 的整数部分。) 输入格式: 输入给出一个正整数 N(2≤N≤10​4​​)。 输出格式: 在一行中输出题面中算式取到的不同值的个数。 输入样例: 2017 输出样例: 1480 思路分析:就是 计算1、2、3、……、N时⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少种结果 可以使用set容器,1、set中的元素都是排好序的,2、set集合中没有重复的元素 #include <iostream> #include <stdio.h> #include <set> using namespace std; int main( ) { int n; set<int> arr; scanf("%d",&n); for(int i = 1; i <= n; i++) { arr.insert(i/2 + i/3 + i/5); } printf("%d",arr.size()); return 0; } 来源: CSDN 作者: 繁星璀璨G 链接: https://blog.csdn.net/qq_40788199/article/details/103753231

codevs 2549 自然数和分解

自作多情 提交于 2020-01-18 03:05:51
2549 自然数和分解 题目描述 Description 把自然数N分解为若干个自然数之和,输出方案数。 输入描述 Input Description N,(1≤n≤50) 输出描述 Output Description 方案数 样例输入 Sample Input 5 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint 5 可分为 1 1 1 1 1 1 1 1 2 1 1 3 1 2 2 1 4 2 3 5 #include<cstdio> using namespace std; int a[100]={1},n,s; void cf(int x,int y) { int i; for(i=a[y-1];i<=x;i++) if(i<=n) { a[y]=i; x-=i;//减去数i,再继续拆分x if(x==0)//拆分结束 s++;//累加方案数 else cf(x,y+1); x+=i;//回溯,以便可以产生所有可能的情况 } } int main() { scanf("%d",&n); cf(n,1); printf("%d",s); return 0; } 类题练习: 洛谷 p2404 来源: https://www.cnblogs.com/jyhywh/p/5573675.html

Codevs 2549 自然数和分解

南笙酒味 提交于 2020-01-18 03:05:10
2549 自然数和分解 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 传送门 题目描述 Description 把自然数N分解为若干个自然数之和,输出方案数。 输入描述 Input Description N,(1≤n≤50) 输出描述 Output Description 方案数 样例输入 Sample Input 5 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint 5 可分为 1 1 1 1 1 1 1 1 2 1 1 3 1 2 2 1 4 2 3 5 /* 又一搜索标签中的DP题. 一想到方案数就想到背包(—ˉ—) 显然j的方案数可以由j-i的方案数转移而来. 有s[j]+=s[j-i]. */ #include<iostream> #include<cstdio> #define MAXN 51 using namespace std; int s[MAXN],n; int main() { s[0]=1; cin>>n; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) s[j]+=s[j-i]; cout<<s[n]; return 0; } 来源: https://www.cnblogs.com/nancheng58/p/6070836.html

1312 连续自然数和

醉酒当歌 提交于 2020-01-18 03:01:20
1312 连续自然数和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 对于一个自然数M,求出所有的连续的自然数段,使得这些连续自然数段的全部数字和为M. eg:1998+1999+2000+2001+2002=10000,所以从1998到2002的一个自然数段为M=10000的一个解。 输入描述 Input Description 一个数M 输出描述 Output Description 每行两个数,为连续自然数段的一头一尾,所有输出行的第一个数按照升序排列 样例输入 Sample Input 10000 样例输出 Sample Output 18 142 297 328 388 412 1998 2002 数据范围及提示 Data Size & Hint 分类标签 Tags 点此展开 数论 数论拜拜,枚举大水题! AC代码 : #include<iostream> using namespace std; int main(){ int m;cin>>m; for(int i=1;i<m;i++){ int p=0; for(int j=i;p<m;j++){ p+=j; if(p==m){ cout<<i<<" "<<j<<"\n"; break; } } } return 0; } 来源

PAT1087 有多少不同的值(C++)

扶醉桌前 提交于 2020-01-15 03:42:43
1087 有多少不同的值 (C++) 题目 当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分。) 输入格式 输入给出一个正整数 N(2≤N≤10 4 )。 输出格式 在一行中输出题面中算式取到的不同值的个数。 输入样例 : 2017 输出样例 : 1480 AC代码: #include < iostream > using namespace std ; int count [ 100000 ] = { 0 } ; int main ( ) { int n ; cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) { int sum = i / 2 + i / 3 + i / 5 ; count [ sum ] ++ ; } int time = 0 ; for ( int i = 0 ; i < 100000 ; i ++ ) { if ( count [ i ] != 0 ) time ++ ; } cout << time ; } 来源: CSDN 作者: hongair 链接: https://blog.csdn.net/qq_41814851/article/details/103962341

数学-杂

自闭症网瘾萝莉.ら 提交于 2020-01-11 17:45:01
伯努利数&自然数幂和: 没办法,现在背背好啦。。。 设$S_n$为自然数幂和,有    $S_n=\frac{1}{k+1}*\sum\limits_{i=0}^{k} C_{k+1}^{i} * B_{i} * n^{k+1-i}$ . 有两种伯努利数,区别是$B[1]$的正负。   1>$B[1]=\frac{1}{2}$时,$S_n= \sum\limits_{i=1}^{n} i^{k}$   2>else,$S_n= \sum\limits_{i=0}^{n-1}i^{k}$ 伯努利数的性质,此时$B[1]=-\frac{1}{2}$。   $\sum\limits_{i=0}^{n}C_{n+1}^{i}*B_{i}=0$ 化成   $\sum\limits_{i=0}^{n}{C_{n+1}^{i}*B_{i}}=-(n+1)*B_{i}$ 然后把阶乘拆开就可以分治$FFT$辣,就是伯努利的求法。 来源: https://www.cnblogs.com/2018hzoicyf/p/12180527.html

AcWing279.自然数拆分

烈酒焚心 提交于 2020-01-10 21:38:08
给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。 注意: 拆分方案不考虑顺序; 至少拆分成2个数的和。 求拆分的方案数 mod 2147483648的结果。 输入格式 一个自然数N。 输出格式 输入一个整数,表示结果。 数据范围 1≤N≤4000 1≤N≤4000 输入样例 7 输出样例 14 解题思路 可以把题目看成是完全背包问题,1到n-1这几个数字可重复使用,背包容量为n #include<iostream> using namespace std; long long a=2147483648; int n; long long dp[4001]; int main() { cin>>n; dp[0]=1; for(int i=1;i<n;i++) for(int j=i;j<=n;j++) dp[j]=(dp[j]+dp[j-i])%a; cout<<dp[n]; } 来源: CSDN 作者: zhanshiy 链接: https://blog.csdn.net/zhanshiy/article/details/103929893

打印100以内的素数

梦想与她 提交于 2020-01-06 01:23:56
1 static void Main(string[] args) 2 { 3 //质数又称素数。指在一个大于1(也就是从2开始)的自然数中,除了1和此整数自身外,不能被其他自然数整除的数 4 for (int i = 2; i <=100; i++)//循环100次,有100个数字 5 { 6 bool b = true; 7 for (int j = 2; j < i; j++) 8 { 9 if (i%j==0)//不能被其他数整除 10 { 11 b = false; 12 break; 13 } 14 } 15 if (b)//如果为false就不打印 16 { 17 Console.WriteLine(i); 18 } 19 20 } 21 Console.ReadKey(); 22 } 来源: https://www.cnblogs.com/zdl9536/archive/2013/05/11/3072903.html

A. 质数的后代(代码优化)

删除回忆录丶 提交于 2020-01-01 01:00:30
题目描述   如果一个合数由两个质数相乘而得,那么我们就叫它是质数们的直接后代。现在,给你一系列自然数,判断它们是否是质数的直接后代。 输入格式   第一行一个正整数T,表示需要判断的自然数数量   接下来T行,每行一个要判断的自然数 输出格式   共T行,依次对于输入中给出的自然数,判断是否为质数的直接后代,是则输出Yes,否则输出No 数据规模和约定   1<=T<=20   2<=要判断的自然数<=10^510 ​5 ​​ 输入样例 4 3 4 6 12 输出样例 No Yes Yes No 关于代码的优化 这个代码OJ上超时 # include <stdio.h> int isPrime ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; int a [ n ] ; int flag [ n ] ; for ( int i = 0 ; i < n ; i ++ ) { scanf ( "%d" , & a [ i ] ) ; flag [ i ] = 0 ; } for ( int i = 0 ; i < n ; i ++ ) { if ( isPrime ( a [ i ] ) == 0 ) { for ( int k = 2 ; k <= a [ i ] / 2 ; k ++ ) { if (