uva1728 Alternate Task(因子和)
来源:互联网 发布:qq三国js技能分析 编辑:程序博客网 时间:2024/05/29 15:59
关键词:求因子和的两种方法
题意:求最大的整数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[n]==-1) printf("-1\n"); else printf("%d\n",max_n[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[n]) printf("-1\n"); else printf("%d\n",max_n[n]); } return 0;}
0 0
- uva1728 Alternate Task(因子和)
- UVa 11728 Alternate Task (逆因子和)
- UVA 11728 - Alternate Task (数论)
- UVa:11728 Alternate Task
- UVa11728 Alternate Task
- UVA - 11728 Alternate Task (唯一分解定理)
- uva 11728 - Alternate Task(数论)
- uva 11728——Alternate Task
- 详解:多边形填充方式(ALTERNATE和WINDING)的区别
- Ubuntu alternate和desktop区别
- Ubuntu alternate和desktop区别
- 因子和因子个数
- hdu4961(因子和倍数)
- nyist 因子和 (素数)
- poj 1845 (因子和)
- (R语言)有序因子和无序因子
- 因子和
- 因子和
- Sqrt(x)
- C++函数设计原则(整理)
- <Android>使用ScrollView 实现 ListView 的下拉刷新
- hihocoder 1099 Constellations
- 九章算法面试题44 设计一个Web Crawler
- uva1728 Alternate Task(因子和)
- 九章算法面试题45 寻找最大的储水容器
- 九章算法面试题46 正负交替
- 九章算法面试题47 分糖果
- 九章算法面试题48 分割回文串
- java反射
- 九章算法面试题49 用栈实现队列
- C#读取MAC地址方式
- 微软早在1985年便首次使用了安卓上饱受争议的汉堡按钮