hdu 2964 Prime Bases (数学:算不上太水)
2014-07-13 18:15
471 查看
感觉还是比较容易的,就是输出的时候可能比较恶心
有些人可能会想着生成一对素数,但其实没有必要
只要先写个小程序找到某个素数使得之前所有素数的乘积大于32为整型最大值即可
这样的话可知只需要这几个素数
解题的过程就是求a[i]的过程
a[i] = cur(n)%tmp[i+1]/tmp[i]
其中tmp[i]为前i个素数的乘积,cur(n)表示的是n把a[i]前面对应的项都减去的结果
就没有必要证明了吧,自己对着写一下就知道了
代码如下:
有些人可能会想着生成一对素数,但其实没有必要
只要先写个小程序找到某个素数使得之前所有素数的乘积大于32为整型最大值即可
这样的话可知只需要这几个素数
解题的过程就是求a[i]的过程
a[i] = cur(n)%tmp[i+1]/tmp[i]
其中tmp[i]为前i个素数的乘积,cur(n)表示的是n把a[i]前面对应的项都减去的结果
就没有必要证明了吧,自己对着写一下就知道了
代码如下:
#include <stdio.h> int prime[15] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int a[15], tmp[15]; int main(void) { int n, i, j, cnt, m; while(scanf("%d", &n) != EOF && n) { m = n; a[0] = n % 2; tmp[0] = 1;tmp[1] = 2; for(i=1; ; ++i) { tmp[i+1] = tmp[i] * prime[i+1]; n -= a[i-1] * tmp[i-1]; if(n <= 0) { cnt = i; break; } a[i] = n % tmp[i+1] / tmp[i]; } printf("%d = ", m); for(i=0; i<10; ++i) { if(a[i]) { printf("%d", a[i]); for(j=1; j<=i; ++j) { printf("*%d", prime[j]); } if(i != cnt-1) printf(" + "); } } printf("\n"); } return 0; }
相关文章推荐
- HDU 2964 Prime Bases 数论 水
- hdu 2964 Prime Bases
- HDU 2964 Prime Bases [Ad Hoc]
- hdu 2964 Prime Bases
- HDU 2964 Prime Bases(数论)
- hdu 4135 Co-prime (组合数学:容斥定理+欧拉函数)
- HDU 4135 Co-prime (容斥原理, 数学)
- hdu 2964 Prime Bases(简单数学题)
- 数学 ( 容斥原理&&求区间内互质数的个数)——Co-prime ( HDU 4135 )
- UVALive 4225 / HDU 2964 Prime Bases 贪心
- URAL —— 1255 & HDU 5100——Chessboard ——————【数学规律】
- hdu 1016 Prime Ring Problem(回溯)
- HDU 5690 All X 数学
- hdu 5391 Zball in Tina Town 威尔逊定理 数学
- hdu 1016 Prime Ring Problem
- HDU - 1016 Prime Ring Problem ——DFS
- 数学 hdu 1719
- HDU - 4810 Wall Painting(组合数学)
- hdu 4135 Co-prime(容斥原理)
- hdu1016-Prime Ring Problem