POJ3489 Knapsack I
来源:互联网 发布:网络歌手算明星吗 编辑:程序博客网 时间:2024/05/21 10:15
题目链接:http://poj.org/problem?id=3489
题目描述:
给定n个数以及x,k,这n个数可以分成k^t( 0<=t )份,比如说其中一个数为6,k为4,可以分为6/4 = 1.5,或者分成6/(4^2) = 0.375,问这些数能否加起来和为x。
即满足:(假设n个数为t1….tn)
x1*(t1/(k^y1)) + x2*(t2/(k^y2))+…………xn*(tn/(k^yn)) = x
关键点就是:
有解的充要条件是,
x能够整除d,(其中d为n个数公约数除以其与k^t的公约数),其中t保证充分大。
推导过程不是很复杂(省略)
推荐一个有详细证明的:
http://www.cppblog.com/menjitianya/archive/2011/04/15/144291.html
#include<cstdio>#include<iostream>using namespace std ;const int MAXM = 100000 ;int num, pri[MAXM] ;int gcd(int a, int b){if( b == 0 ){return a ;}elsereturn gcd(b,a%b) ;}//int get(int n){num = 0 ;for( int i = 2; i*i <= n; i++ ){if( n % i == 0 ){pri[num++] = i ;}while( n % i == 0 ){n /= i ;}}if( n != 1 ) pri[num++] = n ;return num ;}///int main(){int n, x, k, temp, d = 0 ;bool res ;while( cin >> n >> x >> k ){d = 0 ;for( int i = 0; i < n; i++ ){scanf("%d",&temp) ;if( i == 0 )d = temp ;else{d = gcd(d,temp) ;} }get(k) ;res = true ;for( int i = 0; i < num; i++ ){while( d % pri[i] == 0 ){d /= pri[i] ;}}if( x % d != 0 )res = false ; if( res )cout << "Yes\n" ;elsecout << "No\n" ;}return 0 ;}
0 0
- POJ3489 Knapsack I
- Knapsack problem I
- POJ 3489 Knapsack I 英文少
- 1782. Knapsack
- Fibonacci Knapsack
- PERT && Knapsack && 匹配
- 背包问题knapsack
- Sicily 1782 Knapsack
- Sicily 1782. Knapsack
- 1782. Knapsack(动态)
- sicily 1782.Knapsack
- Knapsack problem poj 3264
- course 5 6 knapsack
- lightoj 1127 Funny Knapsack
- The Knapsack problem
- 背包问题(Knapsack problem)
- Knapsack-Dynamic Programming
- Sicily 1782. Knapsack
- ★★ 总结:获取 Iframe内的元素对象,兼容ie、firefox
- VC基于单文档opengl框架
- MapReduce原理
- JSTL 核心标签库 使用
- Ubuntu安装显卡驱动后黑屏问题的分析和解决
- POJ3489 Knapsack I
- 使用Helium找出页面上无用的CSS样式
- [转]英语下午茶:爱,很盲目,很难找,很难得,很难忘
- TreeView绑定无限层级关系类
- 数据库面试题
- 微软机试-测试练习题
- 工本费后的好人就和他阿胶
- Dinic算法详解
- 六种常见的数据加载模式设计