uva1728 Alternate Task(因子和)
2015-05-13 01:31
393 查看
关键词:求因子和的两种方法
题意:求最大的整数N使得它的因子和为S(1<=S<=1000)
解法:
1.求出1-1000内所有数的因子和(O(n*ln(n)))
2.用数组记录每个因子和的最大对应整数n O(n)
法一:公式法
法二:直接求
题意:求最大的整数N使得它的因子和为S(1<=S<=1000)
解法:
1.求出1-1000内所有数的因子和(O(n*ln(n)))
2.用数组记录每个因子和的最大对应整数n O(n)
法一:公式法
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<queue> #include<math.h> #define y1 y11 #define mem(a,b) memset(a,sizeof(a),b) using namespace std; typedef long long ll; const int maxn =1000+10; int n,cas; int max_n[maxn]; int f[maxn]; int factor[maxn],cnt[maxn],tot; void fact(int x){ tot=0; for(int i=2;i*i<=x;i++){ if(x%i==0){ factor[tot]=i; cnt[tot]=0; while(x%i==0){ cnt[tot]++; x/=i; } tot++; } } if(x!=1) factor[tot]=x,cnt[tot++]=1; } int power(int a,int b){ int ans=1; while(b){ if(b&1) ans*=a,b--; b>>=1,a*=a; } return ans; } void init(){ memset(max_n,-1,sizeof(max_n)); max_n[1]=1; for(int i=2;i<=1000;i++){ fact(i); int tmp=1; for(int j=0;j<tot;j++){ tmp*=((power(factor[j],cnt[j]+1)-1)/(factor[j]-1)); if(tmp>1000) break; } if(tmp<=1000) max_n[tmp]=i; } } int main(){ init(); cas=0; while(scanf("%d",&n)!=EOF){ if(n==0) break; printf("Case %d: ",++cas); if(max_n ==-1) printf("-1\n"); else printf("%d\n",max_n ); } return 0; }
法二:直接求
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #define y1 y11 #define mem(a,b) memset(a,sizeof(a),b) using namespace std; typedef long long ll; const int maxn =1000+10; int n,cas; int max_n[maxn],f[maxn]; void init(){ for(int i=1;i<=maxn-5;i++) for(int j=i;j<maxn;j+=i){ if(f[j]>1000) continue;//防止溢出 f[j]+=i; } for(int i=1;i<=maxn-5;i++) if(f[i]<=1000){ max_n[f[i]]=i; } } int main(){ init(); cas=0; while(scanf("%d",&n)!=EOF){ if(n==0) break; printf("Case %d: ",++cas); if(!max_n ) printf("-1\n"); else printf("%d\n",max_n ); } return 0; }
相关文章推荐
- UVa 11728 Alternate Task (逆因子和)
- UVA - 11728 Alternate Task (唯一分解定理)
- uva 10791 Minimum Sum LCM(分解素因子)
- uva 11728 Alternate Task
- UVALive 6657 GCD XOR 异或,因子筛法
- Uva 11395 Sigma Function (因子和)
- UVa 10791 Minimum Sum LCM(素因子分解)
- UVA294 UVALive5595 Divisors【正因子数】
- UVA 294 - Divisors 因子个数
- UVA-11728 Alternate Task
- 【数论,水题】UVa 11728 - Alternate Task
- UVa 10392 Factoring Large Numbers (素因子分解)
- UVA 10791 Minimum Sum LCM(素因子)
- uva 11728 - Alternate Task(数论)
- uva 993 Product of digits (贪心 + 分解因子)
- uva 10110 平方数的因子有奇数个
- uva 10892 素因子分解
- UVA 11728 - Alternate Task (数论)
- UVA 11889-Benefit(数学_快速枚举因子)
- UVA - 10392 Factoring Large Numbers 分解因子