CF 402-D 贪心
2014-03-31 00:53
302 查看
觉得题目描述应改为 r>1
中间理解错:g是前r个数的gcd,不是一些共同因数的乘积
中间理解错:g是前r个数的gcd,不是一些共同因数的乘积
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; #define N 40003 int gcd(int a, int b) { if(b==0) return a; return gcd(b, a%b); } int a[5500], b[5500], g[5500]; int prime , isprime , cnt; int n,m; int calc(int num) { int res = 0; for(int j=1; j<=m & num>=b[j]; ++j) if(num%b[j] == 0) { do{ num /= b[j]; --res; }while(num%b[j] == 0); } for(int j=0; (long long)prime[j]*prime[j]<=num; ++j) if(num%prime[j] == 0) { do{ ++res; num /= prime[j]; }while(num%prime[j] == 0); } if(num>1) res++; return res; } int main () { for(int i=2; i<N; ++i) if(!isprime[i]) { prime[cnt++] = i; for(int j=i; j<N; j+=i) isprime[j] = 1; } scanf("%d%d", &n, &m); for(int i=1; i<=n; ++i) scanf("%d", &a[i]); for(int i=1; i<=m; ++i) scanf("%d", &b[i]); g[1] = a[1]; for(int i=2; i<=n; ++i) g[i] = gcd(a[i], g[i-1]); int ans = 0; for(int i=n, di=1; i>=1; --i) { g[i] /= di; if(calc(g[i]) <= 0) di *= g[i]; a[i] /= di; ans += calc(a[i]); } printf("%d\n", ans); return 0; }
相关文章推荐
- 性能测试需要掌握什么
- 数据类型、操作过程和程序
- 学习Android之第三个小程序计算器(Menu、Dialog)
- MyReport 2.6.4.0新功能
- 深入理解JavaScript系列(5):强大的原型和原型链
- UNDO长时间回滚不释放
- 关于HTML <!DOCTYPE> 标签的使用
- Java的内存回收机制
- Android开发 语音识别技术之科大讯飞语音识别(一) — 语音听写
- c++ 之类的前置声明
- C语言中scanf、getchar、gets函数的比较
- 静态链接库(Lib)与动态链接库(DLL)的区别
- 关于类似于自动填充搜索框的DEMO
- Python 书籍推荐
- 关于*p++ *(p++) (*p)++ *++p *(++p) ++*p ++(*p)
- Extjs4.0.7 提交表单
- 如何理解指向指针的指针?
- 我对搜索算法的一点点理解
- Java中getResourceAsStream的用法
- 其实自己胆量真的还不够