【动态规划】mr359-最大公约数之和

【题目大意】

选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。

输入一个正整数S。

输出最大的约数之和。

样例输入 Sample Input

11

样例输出 Sample Output

9

样例说明
取数字4和6,可以得到最大值(1+2)+(1+2+3)=9。

数据规模对于30%的数据,S≤10;

对于100%的数据,S≤1000。

【思路】

水题,普通的01背包问题,唯一需要注意的一点是,1的所有约数之和是0!我一开始就因为1没有单独判断而导致了错误。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 const int MAXN=1000+50;
 7 int s;
 8 int w[MAXN],f[MAXN];
 9
10 int main()
11 {
12     freopen("mr359.in7","r",stdin);
13     freopen("mr359.ou7","w",stdout);
14     scanf("%d",&s);
15     memset(w,0,sizeof(w));
16     w[1]=0;
17     for (int i=2;i<=s;i++)
18     {
19         for (int j=1;j<=sqrt(i);j++)
20             if (i%j==0)
21             {
22                 w[i]+=j;
23                 if (j*j!=i && j!=1) w[i]+=i/j;
24             }
25     }
26
27     f[0]=0;
28     for (int j=1;j<=s;j++) f[j]=-0x7fffffff;
29     for (int i=0;i<=s;i++)
30         for (int j=s;j>=i;j--)
31         {
32             f[j]=max(f[j],f[j-i]+w[i]);
33         }
34     cout<<f[s]<<endl;
35     return 0;
36 }
时间: 2024-11-08 12:19:58

【动态规划】mr359-最大公约数之和的相关文章

1040 最大公约数之和

1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) Output 公约数之和 Input示例 6 Output示例 15思路:欧拉函数:找n的约数,k为n的一个约数,设s,n的最大公约数为k,那么我们可以知道gcd(s/k,n/

51nod 1040 最大公约数之和 (数学)

给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) OutPut 公约数之和 Input示例 6 Output示例 15 AC代码: /** *@xiaoran *1 2 3 4 5 6 *1 2 3 2 1 6 *2个1,2个2,1个3,1个6,注意后面的值都是n的因子. *现在我们只需要计算出各个因子的个数就行了, *那么1的个数是与n互质的

最大公约数之和——极限版II

P1490 - [UVa11426 ]最大公约数之和--极限版II Description Input 输入包含至多100组数据.每组数据占一行,包含正整数N(2<=N<=1<N<4000000).输入以N=0结束. Output 对于每组数据,输出一行,即所对应的G值.答案保证在64位带符号整数范围内. Sample Input 10 100 200000 0 Sample Output 67 13015 143295493160 Hint 数据范围: 对于30%的数据,2<

51 nod 1188 最大公约数之和 V2

1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数): G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 5000

51Nod 1040 最大公约数之和

                                 1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) //实际上应该是n<=10^18 Output 公约数之和 Input示例 6 Output示例 15 欧拉函数 对于 样例 1 2 3 2 1 ----6 有2个1 2个2 和 1个3 两个1的情况

1188 最大公约数之和 V2

1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数): G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:每行

51 NOD 1188 最大公约数之和 V2(基础数论)

传送门 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和.计算这段程序 G=0; for(i=1; i < N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:每行一个数N.(2 <= N <= 5000000) Output 共T行,输出最大公约数之和. Input示例 3 10 100 20000

51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N(N <= 10^9) 输出 公约数之和 输入样例 6 输出样例 15 题解 \[ \sum_{i=1}^n\gcd(i,n)=\sum_{d|n}d\varphi(n) \] 暴力搞就行了. 1188 最大公约数之和 V2 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计

51nod_1040:最大公约数之和

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. 比较基础的一道数论题. //注:本人觉得理解好这里有助于去理解burnside定理的优化 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL Eular(LL n) { LL ret=n; for(LL i=2

51nod1040 最大公约数之和 (欧拉函数 )

题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 分析: 我们可以枚举x的约束为xi,那么结果就等于 sum = sigma( xi * mi)  mi  表示的是与x最大公约数 为xi的数的个数,那么我们的问题就转化成了求mi: 如果GCD(x,m) == f  那么我们将其转化到 [1,x/f]区间内 则与x/f互质的数的个数 转化到[1,x]区间内就等于最大 公约数为f的数的个数. 代码如下: