求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
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.你想知道你的另一半吗?
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 ...
随机推荐
- c++学习笔记之基础---类内声明函数后在类外定义的一种方法
在C++的“类”中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数体. } 这个是在类 ...
- Direct3D 9 入门样例程序 圆锥体
介绍 Directx3D 9 什么是DirectX,非常好说了,Win32 C++ API.主要是多媒体编程方面的,长处体如今高性能了,如今我知道的版本号最高是D3D11,可是我是学习入门的,从D3D ...
- CentOS7虚拟机桥接设置及问题
转载请注明出处:jiq•钦's technical Blog 今天在VMWare WorkStation9中安装了CentOS7虚拟机. 虚拟机与宿主机网络连接有三种方式:桥接模式.NAT模式和Ho ...
- Phoenix(SQL On HBase)安装和使用报告
一.为什么使用Phoenix二.安装Phoenix2.1 兼容问题?2.2 编译CDH版本的Phoenix2.3 安装Phoenix到CDH环境中三.Phoenix的使用3.1 phoenix的4种调 ...
- Ehcache CacheManager
CacheManager是Ehcache框架的核心类和入口,它负责管理一个或多个Cache对象.要使用Ehcache框架,必须要先创建 CacheManager 对象.现在我们学习下,如何创建 Cac ...
- html5--6-6 CSS选择器3
html5--6-6 CSS选择器3 实例 学习要点 掌握常用的CSS选择器 了解不太常用的CSS选择器 什么是选择器 当我们定义一条样式时候,这条样式会作用于网页当中的某些元素,所谓选择器就是样式作 ...
- opencv直方图该怎么画
图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...
- [Selenium] Grid 介绍
Selenium Grid 支持分布式测试,使测试人员可在分布式环境中进行测试 一般而言,在面临以下情况时可考虑使用Selenium Grid : 1.测试多个浏览器或单个浏览器多个版本,或测试不同操 ...
- 「NOIP2012」「LuoguP1083」 借教室
Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的 ...
- 奶牛排序——RMQ
[问题描述]奶牛在熊大妈的带领下排成了一条直队.显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛 A 是最矮的,最右边的 B 是最高的,且 B 高于 A ...