求n的因子个数与其因子数之和
方法一:朴素算法:O(n)。
- #include<bits/stdc++.h>
- using namespace std;
- int get_num(int n){
- int num=;
- for(int i=;i<=n;++i)
- if(n%i==)num++;
- return num;
- }
- int get_sum(int n){
- int tot=;
- for(int i=;i<=n;++i)
- if(n%i==)tot+=i;
- return tot;
- }
- int main(){
- int n;
- while(cin>>n){
- cout<<get_num(n)<<endl;//求n的因子个数
- cout<<get_sum(n)<<endl;//求n的因子数之和
- }
- return ;
- }
方法二:约数个数定理:O(√n)。
- #include<bits/stdc++.h>
- using namespace std;
- int get_num(int n){
- int tot=;
- for(int i=;i*i<=n;++i){
- if(n%i==){
- int x=;
- while(n%i==){
- n/=i;
- x++;
- }
- tot*=(x+);
- }
- }
- if(n>)tot*=;
- return tot;
- }
- int get_sum(int n){
- int tot=;
- for(int i=;i*i<=n;i++){
- if(n%i==){
- int mul=;
- while(n%i==){
- n/=i;
- mul*=i;
- }
- tot*=(mul*i-)/(i-);
- }
- }
- if(n>)tot*=(n+);
- return tot;
- }
- int main(){
- int n;
- while(cin>>n){
- cout<<get_num(n)<<endl;//求n的因子个数
- cout<<get_sum(n)<<endl;//求n的因子数之和
- }
- return ;
- }
实战例题:
题解报告:hdu 2521 反素数
Problem Description
Input
输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].
Output
Sample Input
2 3
1 10
47 359
Sample Output
2的因子为:1 2
- #include<bits/stdc++.h>
- using namespace std;
- int n,a,b,maxnum,maxindex;
- int get_num(int n){//求n的因子个数
- int tot=;
- for(int i=;i*i<=n;++i){
- if(n%i==){
- int x=;
- while(n%i==){
- n/=i;
- x++;
- }
- tot*=(x+);
- }
- }
- if(n>)tot*=;
- return tot;
- }
- int main(){
- while(cin>>n){
- while(n--){
- cin>>a>>b;maxnum=;maxindex=a;
- for(int i=a;i<=b;++i){
- int tmp=get_num(i);
- if(tmp>maxnum){maxindex=i;maxnum=tmp;}
- }
- cout<<maxindex<<endl;
- }
- }
- return ;
- }
题解报告:hdu 1215 七夕节
Problem Description
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:

你想知道你的另一半吗?
Input
Output
Sample Input
Sample Output
- #include<bits/stdc++.h>
- using namespace std;
- int t,n;
- int get_sum(int n){
- int tot=;
- for(int i=;i*i<=n;++i){
- if(n%i==){
- int mul=;
- while(n%i==){
- n/=i;
- mul*=i;
- }
- tot*=(mul*i-)/(i-);
- }
- }
- if(n>)tot*=(n+);
- return tot;
- }
- int main(){
- while(~scanf("%d",&t)){
- while(t--){
- scanf("%d",&n);
- printf("%d\n",get_sum(n)-n);
- }
- }
- return ;
- }
AC代码二(109ms):简单打表,时间复杂度为nlogn。
- #include<bits/stdc++.h>
- const int maxn=;
- using namespace std;
- int t,n,sum[maxn];
- int main(){
- for(int i=;i<maxn/;++i)//因子i
- for(int j=i*;j<maxn;j+=i)//j是i的倍数,即j的因子是i
- sum[j]+=i;//sum[j]表示其所有因子之和
- while(~scanf("%d",&t)){
- while(t--){
- scanf("%d",&n);
- printf("%d\n",sum[n]);
- }
- }
- return ;
- }
题解报告:hdu 1999 不可摸数
Problem Description
Input
Output
Sample Input
Sample Output
- #include<bits/stdc++.h>
- const int maxn=;
- using namespace std;
- int t,n,sum[maxn];bool f[maxn];
- int main(){
- memset(f,false,sizeof(f));
- for(int i=;i<maxn/;++i)//因子i
- for(int j=i*;j<maxn;j+=i)//j是i的倍数,即j的因子是i
- sum[j]+=i;//sum[j]表示其所有因子之和
- for(int i=;i<maxn;++i)
- if(sum[i]<=)f[sum[i]]=true;//如果真因数之和在1000以内,那么sum[i]不是不可摸数
- while(~scanf("%d",&t)){
- while(t--){
- scanf("%d",&n);
- if(f[n])printf("no\n");
- else printf("yes\n");//n为不可摸数
- }
- }
- return ;
- }
AC代码二(0ms):
- #include<bits/stdc++.h>
- using namespace std;
- int t,n;bool f[];
- int main(){
- int obj[]={,,,,,,,,,,
- ,,,,,,,,,,,,
- ,,,,,,,,,,,,
- ,,,,,,,,,,,,
- ,,,,,,,,,,,,
- ,,,,,,,,,,,,
- ,,,,,,,,,,,,
- ,,,,,,};
- memset(f,false,sizeof(f));
- for(int i=;i<;++i)f[obj[i]]=true;//1000以内共有89个数为不可摸数
- while(~scanf("%d",&t)){
- while(t--){
- scanf("%d",&n);
- if(f[n])printf("yes\n");
- else printf("no\n");
- }
- }
- return ;
- }
题解报告:hdu 1299 Diophantus of Alexandria
Problem Description
Consider the following diophantine equation:
1 / x + 1 / y = 1 / n where x, y, n ∈ N+ (1)Diophantus is interested in the following question: for a given n, how many distinct solutions (i. e., solutions satisfying x ≤ y) does equation (1) have? For example, for n = 4, there are exactly three distinct solutions:
1 / 5 + 1 / 20 = 1 / 4
1 / 6 + 1 / 12 = 1 / 4
1 / 8 + 1 / 8 = 1 / 4Clearly, enumerating these solutions can become tedious for bigger values of n. Can you help Diophantus compute the number of distinct solutions for big values of n quickly?
Input
Output
Sample Input
Sample Output
3
113
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long LL;int t;LL n;
- LL get_num(LL x){
- LL ans=,tp;
- for(LL i=;i*i<=x;++i){
- if(x%i==){
- tp=;
- while(x%i==)tp++,x/=i;
- ans*=(+*tp);
- }
- }
- if(x>)ans*=;
- return ans;
- }
- int main(){
- while(cin>>t){
- for(int i=;i<=t;++i){
- cin>>n;
- cout<<"Scenario #"<<i<<":\n"<<(get_num(n)+)/<<"\n"<<endl;
- }
- }
- return ;
- }
题解报告:NYOJ #66 分数拆分
描述
现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y.
输入
第一行输入一个整数n,代表有n组测试数据。
接下来n行每行输入一个正整数k
输出
按顺序输出对应每行的k找到所有满足条件1/k=1/x+1/y的组合。
样例输入
- 2
- 2
- 12
样例输出
- 1/2=1/6+1/3
- 1/2=1/4+1/4
- 1/12=1/156+1/13
- 1/12=1/84+1/14
- 1/12=1/60+1/15
- 1/12=1/48+1/16
- 1/12=1/36+1/18
- 1/12=1/30+1/20
- 1/12=1/28+1/21
- 1/12=1/24+1/24
解题思路:由x>=y且x、y均大于k可知1/x<=1/y,1/k-1/y<=1/y,即k<y<=2k,所以只需控制y的枚举范围即可。
AC代码:
- #include<bits/stdc++.h>
- using namespace std;
- int t,k;
- int main(){
- while(cin>>t){
- while(t--){
- cin>>k;
- for(int i=k+;i<=*k;++i)//枚举k+1~2k
- if(i*k%(i-k)==)printf("1/%d=1/%d+1/%d\n",k,i*k/(i-k),i);//通分,其中(i-k)|(i*k)。
- }
- }
- return ;
- }
财大情侣
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
- 高考完终于来到梦寐以求的财经大学,男三女七有木有!食堂吃饭前后左右三排都是女生有木有!该学校总共有n个人,每个人都有对应自己的魅力值,从1到n。现规定每个人的情商为每个人魅力值的约数(不包括本身)之和。在广财有个很神奇的事情,当一个人的情商刚好等于另一个的魅力值的时候,这两个人就meant to be情侣(不是一男一女怎么办?随便吧)。
- 如:220:1+2+4+5+10+11+20+22+44+55+110=284
- 284:1+2+4+71+142=220
- 这样魅力值为220和284的就成为一对啦。
- 给定两个数,a,b,找出所有a和b之间(inclusive)成对的。
Input:
- 输入包含多组测试数据,每组数据输入两个数a,b (0<=a,b<=100000).
Output:
- 对于每组测试,输出a和b之间的所有情侣。每对情侣占一行,魅力值小的在前面。对于多对情侣,按情侣中魅力值小的排序。参考sample output。
Sample Input:
- 200 1300
- 1 200
Sample Output:
- 220 284
- 1184 1210
- NO
解题思路:求每个数的所有真因子之和,简单打个表再判断一下即可。
AC代码:
- #include<bits/stdc++.h>
- const int maxn=;//范围大一点,否则会出现越界的情况
- using namespace std;
- int a,b,x,sum[maxn];bool flag;
- int main(){
- for(int i=;i<maxn/;++i)//求因子数之和
- for(int j=i*;j<maxn;j+=i)//j初始为i的2倍,以后以i的步长增长,累加j的真因子
- sum[j]+=i;
- while(cin>>a>>b){
- if(a>b)swap(a,b);flag=false;
- for(int i=a;i<=b;++i)//先判断是不是一对情侣,并且前面的因子数之和x要在区间范围内,且前一个数i要小于后一个数x
- if(i==sum[x=sum[i]]&&x<=b&&i<x){flag=true;cout<<i<<' '<<x<<endl;}
- if(!flag)cout<<"NO"<<endl;
- }
- return ;
- }
求n的因子个数与其因子数之和的更多相关文章
- Soldier and Number Game---cf546D(打表求n的素因子个数)
题目链接:http://codeforces.com/problemset/problem/546/D 题意: 给出一个n,n开始是a!/b!,每次用一个x去整除n得到新的n,最后当n变成1的时候经过 ...
- Almost All Divisors(求因子个数及思维)
---恢复内容开始--- We guessed some integer number xx. You are given a list of almost all its divisors. Alm ...
- LightOj1028 - Trailing Zeroes (I)---求因子个数
题目链接:http://lightoj.com/volume_showproblem.php?problem=1028 题意:给你一个数 n (1<=n<=10^12), 然后我们可以把它 ...
- POJ 2992 Divisors (求因子个数)
题意:给n和k,求组合C(n,k)的因子个数. 这道题,若一开始先预处理出C[i][j]的大小,再按普通方法枚举2~sqrt(C[i][j])来求解对应的因子个数,会TLE.所以得用别的方法. 在说方 ...
- Acdream1084 寒假安排 求n!中v因子个数
题目链接:pid=1084">点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 ...
- Trailing Zeroes (I) LightOJ - 1028(求因子个数)
题意: 给出一个N 求N有多少个别的进制的数有后导零 解析: 对于一个别的进制的数要转化为10进制 (我们暂且只分析二进制就好啦) An * 2^(n-1) + An-1 * 2^(n-2) + `` ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-等式(求$N^2$的因子个数)
一.题目链接 https://www.nowcoder.com/acm/contest/90/F 二.题面 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言655 ...
- 求n!中因子k的个数
思路: 求n的阶乘某个因子k的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通.其实n!可以表示成统一的方式. n!=(km)*(m!)*a ...
- BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...
随机推荐
- mysql读写分离(主从复制)实现
mysql主从复制 怎么安装mysql数据库,这里不说了,仅仅说它的主从复制.过程例如以下: 主从最好都是同一种系统比方都是linux,或者都是windows,当然混合着也是能够成功,不解释了 1.主 ...
- Python 002- 爬虫爬取淘宝上耳机的信息
参照:https://mp.weixin.qq.com/s/gwzym3Za-qQAiEnVP2eYjQ 一般看源码就可以解决问题啦 #-*- coding:utf-8 -*- import re i ...
- Jetty的JNDI数据源
一. 此处绑定的数据源是以 DBCP 为实现.首先必须将数据库驱动(这里用了MYSQL数据库)和DBCP所需要的 Jar 包复制到 Jetty 根目录的 lib 目录下.DBCP主要需要以下3个文件: ...
- mybatis xml文件解析
1 parameterType 如果参数只有一个,比如一个id,即int类型的id,那么parameterType直接是int. 如果参数有多个,那么就用表中一行对应的类,默认是类的名字和表中列的名字 ...
- 20170218 OO-ALV标准工具栏按钮
原文地址:OO ALV 工具栏对于的功能码 图标与对应的 功能码 明细 &DETAIL 检查 &CHECK 刷新 &REFRESH 剪切 &LOCAL&CU ...
- 将异常(getStackTrace)转化成String
方法一: private static String getStackMsg(Exception e) { StringBuffer sb = new StringBuffer(); StackTra ...
- 微信小程序template使用
当您的项目需要多次使用同一个布局和样式的时候,您就可以考虑使用template(模板)来减少冗余代码. 使用方式: 1.新建一个template文件夹来存放您的通用模板: 2.在文件夹里面新建一个wx ...
- ajax访问json文件缓存问题
ajax访问json文件,json文件改动,访问的时候也不能及时看到改动后的内容. 这是因为浏览器缓存的原因. 在这时候就需要清除浏览器的缓存或者加上一个标记,让ajax访问文件的时候知道这是一个新的 ...
- mysql数据库引擎InnoDB和MyISAM的区别
InnoDB支持行级锁和表级锁(默认行级锁),支持事务,外部键等:大量的insert和update更快等.只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁. MyI ...
- Linux时间子系统之(一):时间的基本概念【转】
本文转载自:http://www.wowotech.net/timer_subsystem/time_concept.html 本文使用Q & A的方式来和大家以前探讨一下时间的基本概念 一. ...