NYOJ 411 Friends number (数论--因子和)

链接:点击打开链接

题意:

Friends number

时间限制:2000 ms  |  内存限制:65535 KB

难度:2

描述

Paula and Tai are couple. There are many stories between them. The day Paula left by airplane, Tai send one message to telephone 2200284, then, everything is changing… (The story in “the snow queen”).

After a long time, Tai tells Paula, the number 220 and 284 is a couple of friends number, as they are special, all divisors of 220’s sum is 284, and all divisors of 284’s sum is 220. Can you find out there are how many couples of friends number less than
10,000. Then, how about 100,000, 200,000 and so on.

The task for you is to find out there are how many couples of friends number in given closed interval [a,b]。

输入
There are several cases.

Each test case contains two positive integers a, b(1<= a <= b <=5,000,000).

Proceed to the end of file.

输出
For each test case, output the number of couples in the given range. The output of one test case occupied exactly one line.
样例输入
1 100
1 1000
样例输出
0
1
提示
6 is a number whose sum of all divisors is 6. 6 is not a friend number, these number is called Perfect Number.
来源
辽宁省10年省赛

思路:其实理解题意就比较简单,求区间满足“friend num”的数的对子的个数,friend num:假设,a,b,如果a的所有因子和==b,且b的所有因子和==a,,及满足!

oj数据有点大,常规方法,一个劲的超时,看了一下排在前几名的人的代码,基本都是打表过,(囧~~),后来有点提示,用数组模拟过了,其实还可以用容器

,那样写的话看的比较舒服。

代码:(红色区域重点)

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 5000001
#define CLR(arr, what) memset(arr, what, sizeof(arr))
int a[N] ,pre[N],last[N],ss=0;
void getsum();
int main()
{
    //getsum();
//    for(int i = 2; i <= N; i++) a[i] = 1;
//    for(int i = 2; i * i <= N; i++)
//        for (int j = i; j * i <= N; j++)
//            a[i * j] += i + j;
   <span style="color:#ff0000;"> for(int i = 2; i <= N; i++) a[i] = 1;
    for(int i = 2; i * i <= N; i++)
        for(int j = i + 1; i * j <= N; j++)
            a[i * j] += i + j;
    for(int i = 2; i * i <= N; i++)
        a[i * i] += i;
    for(int i=1; i<=N; i++)
    {
        int t=a[i];
        if (t > i && t <=N&& a[t] == i)
        {
            pre[ss]=i;
            last[ss]=t;
            ss++;
        }
    }</span>
    int m,i,j,n;
    while(~scanf("%d%d",&m,&n))
    {
        int count = 0;
        for(i=0; i<ss; i++)
            if(pre[i]>=m&&last[i]<=n)
                count++;
        printf("%d\n",count);
    }
    return 0;
}        

When you want to give up, think of why you persist until now!

时间: 2024-10-07 21:00:58

NYOJ 411 Friends number (数论--因子和)的相关文章

HDU 4937 Lucky Number(数论)

HDU 4937 Lucky Number 题目链接 题意:给定一个数字,求它再x进制下,每位进制位上都只有3,4,5,6,求这样的x有多少种,如果无限种输出-1 思路:首先3 4 5 6特判掉是无限的,很容易想到就不证明了,然后就是枚举数字的最后一位3,4,5,6,然后进制数肯定来自这个数字的因子,因为剩下的数字肯定是a1x^1 + a2x^2 + a3x^3...这样的,这样只要在因子中找进制,去判断即可.找因子的方法用先分解再dfs找,直接试除会超时 代码: #include <cstdi

NYOJ 928 小M的因子和(数论)

小M的因子和 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 小M在上课时有些得意忘形,老师想出道题目难住他.小M听说是求因子和,还是非常得意,但是看完题目是求A的B次方的因子和,有些手足无措了,你能解决这个问题吗? 输入 有多组测试样例 每行两个数 A ,B ,(1≤A,B≤10^9)  输出 输出A的B次方的因子和,并对9901取余. 样例输入 2 3 样例输出 15 分析:对A进行质因数分解,假设A = (p1^a1) * (p2^a2)*--*(pk^ak)

nyoj 1172 unlucky number

unlucky number 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 我们定义在区间[l,r]之间只出现1和7组合的数是unlucky number,例如:1 .7. 11.17 都是unlucky numbers ,而 13 .27则不是,问在区间[l,r]内有多少 unlucky numbers?? 输入 有多组测试数据(不超过100组) 每组输入两个整数l,r( 0 =< l<= r <= 10^18) 输出 每行输入一个结果 样例输入 1 7

[POJ3696]The Luckiest number(数论)

题目:http://poj.org/problem?id=3696 题意:给你一个数字L,你要求出一个数N,使得N是L的倍数,且N的每位数都必须是8,输出N的位数(如果不存在输出0) 分析: 首先我们假设N是x个8组成的 那么88888...888=kL 提个8出来:8*111..1111=kL ① 因为题目只要求x的值,所以要弄出关于x的方程 11...111可以写成(10^k-1)/9 于是①变成了8(10^x-1)=9kL ② 再来回顾下题目,②式中x和k是变量,且都属于正整数,要根据②式

NYOJ 1066 CO-PRIME(数论)

CO-PRIME 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 This problem is so easy! Can you solve it? You are given a sequence which contains n integers a1,a2--an, your task is to find how many pair(ai, aj)(i < j) that ai and aj is co-prime. 输入 There are mult

NYOJ 508 余数求和 (数论问题)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=508 给你两个数n,k,请求出的值. 输入 每行两个数n, k(1 <= n, k <= 10^9). 输出 输出和,每个结果占一行. 样例输入 5 4 5 3 样例输出 5 7 题目分析: 对于此题不能直接进行暴力,数值大,只能用sqrt(n)的算法,首先计算n%i的余数和,i=1~n:注意到:n%i=n/i*i; 因此我们可以模拟从i=1~sqrt(n);sum+=n%i;对于i对

bzoj3000 Big Number 数论,斯特林公式

Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数——N,K Output 每行一个数为输出结果 Sample Input 2 52 1010 10100 200 Sample Output 11769对于100%的数据,有2≤N≤2^31, 2≤K≤200,数据组数T≤200. 题解 用Stirling公式求近似值 位数=logk(n!)+1 ≍ logk(sqrt(2πn)*(n/e)^n)+1 = logk

组合数取模(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/52553048 0. 写在前面 在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题.以下部分内容改编自AekdyCoin的<组合数求模>,而且为了感谢他对(懵懂的)笔者的启发,这篇文章的标题与其文章相同.另外,感谢Picks将多项式运算的技巧在中国进行推广,感谢51nod提供了许多有趣的数论题目,感谢fot

用antlr4来实现《按编译原理的思路设计的一个计算器》中的计算器

上次在公司内部讲<词法分析--使用正则文法>是一次失败的尝试--上午有十几个人在场,下午就只来了四个听众. 本来我还在构思如何来讲"语法分析"的知识呢,但现在看来已不太可能. 这个课程没有预想中的受欢迎,其原因可能是: 1.课程内容相对复杂,听众知识背景与基础差异比较大. 2.授课技巧不够,不能把复杂的知识简单化的呈现给基础稍差一点的人. 针对这两个可能的原因,我要尝试做出以下调整: 1.使用antlr来实现词法和语法的部分. 2.暂时把"编译"过程改为