codeforces 402 D. Upgrading Array(数论+贪心)
题目链接:http://codeforces.com/contest/402/problem/D
题意:给出一个a串和素数串b 。f(1) = 0; p为s的最小素因子如果p不属于b , 否则 .
a串还可以进行这样的操作找一个r使得(1<=r<=n)g=gcd(a[1],a[2]......a[r]),然后再是a[1~r]/g。
题解:其实f的求和可以理解为num1(好的素因子)-num2(不好的素因子)。
然后就是对a操作的理解,a怎么样才需要进行这样的操作呢?只要g中不好的素因子大于好的素因子那么,
删掉这样的g就能增加f的总和。还有求除最小素因数的方法
for(int j = 2 ; j * j <= x ; j++) {//这个是快速的求法,为什么这么求可以自行理解
if(!prime[j])//prime表示是否是素数与处理一下
continue;
if(x % j)
continue;
bool flag = mmp[j];//定义map的mmp来判断j是否是坏素因数
while(x % j == 0) {
x /= j;
if(flag)
ans--;
else
ans++;
}
}
if(x > 1) {
if(mmp[x])
ans--;
else
ans++;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <iostream> #include <cmath> #include <cstdio> #include <map> #define inf 0X3f3f3f3f using namespace std; const int M = 1e5 + 10; int a[5010] , b[5010]; int prime[M]; map< int , bool >mmp; void IsPrime(){ prime[0] = prime[1] = 0; prime[2] = 1; for ( int i = 3 ; i < M ; i++) prime[i] = i % 2 == 0 ? 0 : 1; int t = ( int ) sqrt (M * 1.0); for ( int i = 3 ; i <= t ; i++) if (prime[i]) for ( int j = i * i ; j < M ; j += 2 * i) prime[j] = 0; } int gcd( int x , int y) { return (y > 0) ? gcd(y , x % y) : x; } int main() { int n , m; scanf ( "%d%d" , &n , &m); mmp.clear(); IsPrime(); for ( int i = 0 ; i < n ; i++) { scanf ( "%d" , &a[i]); } for ( int i = 0 ; i < m ; i++) { scanf ( "%d" , &b[i]); mmp[b[i]] = true ; } for ( int i = n - 1 ; i >= 0 ; i--) { int x = 0; for ( int j = 0 ; j <= i ; j++) { x = gcd(x , a[j]); } int bad = 0 , good = 0; int xx = x; for ( int l = 2 ; l * l <= x ; l++) { if (!prime[l]) continue ; if (x % l) continue ; bool flag = mmp[l]; while (x % l == 0) { x /= l; if (flag) bad++; else good++; } } if (x > 1) { if (mmp[x]) bad++; else good++; } if (bad > good) { for ( int j = 0 ; j <= i ; j++) { a[j] /= xx; } } } int ans = 0; for ( int i = 0 ; i < n ; i++) { int x = a[i]; for ( int j = 2 ; j * j <= x ; j++) { if (!prime[j]) continue ; if (x % j) continue ; bool flag = mmp[j]; while (x % j == 0) { x /= j; if (flag) ans--; else ans++; } } if (x > 1) { if (mmp[x]) ans--; else ans++; } } printf ( "%d\n" , ans); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!