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),假设A的因子和为sum,

则sum=(1 + p1 + p1^2 + ……+p1^a1)*(1+p2+p2^2 + ……+p2^a2)*……*(1+pk+pk^2+……+pk^ak),把这个式子展开之后.每一项刚好是A的因子。

所以求A^B的因子和时,只需把ai 改为ai*b,然后再求解即可。求得时候因为次方比较大,要用分治和快速幂来求。

#include <cstdio>
#include <cmath>
const int mod = 9901;

int Pow(int a, int n) {  //快速幂求a^n
    int res = 1;
    a %= mod;
    while(n) {
        if(n&1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

int get_sum(int a, int n) {  //求(1 + a + a^2 + …… + a^n)
    if(n == 0) return 1;
    if(n&1) return get_sum(a, n / 2) * (Pow(a, (n / 2 + 1)) + 1) % mod;
    else return (get_sum(a, n / 2 - 1) * (Pow(a, n / 2) + 1) + Pow(a, n)) % mod;
}

int main() {
    int a, b;
    while(~scanf("%d%d", &a, &b)) {
        int ans = 1;
        int m = (int)sqrt(a + 0.5);
        for(int i = 2; i <= m; ++i) {
            if(a % i == 0) {
                int k = 0;
                while(a % i == 0) {
                    k++;
                    a /= i;
                }
                ans = ans * get_sum(i, k * b) % mod;
            }
        }
        if(a > 1) ans = ans * get_sum(a, b) % mod;
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-10-07 23:48:40

NYOJ 928 小M的因子和(数论)的相关文章

NYOJ 676 小明的求助

小明的求助 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 小明对数学很有兴趣,今天老师出了道作业题,让他求整数N的后M位,他瞬间感觉老师在作弄他,因为这是so easy! 当他看到第二道题目的时候,他就确定老师在捉弄他了,求出N^P的后M位,因为他不会了.你能帮他吗? 输入 第一行包含一个整数T(T <= 1000),代表测试数据组数. 接下来的T行每行含三个整数,N,P,M(1 <= N <= 10^10,1 <= P <= 10^15,1

HDU 6108 小C的倍数问题 数论

小C的倍数问题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6108 Description 根据小学数学的知识,我们知道一个正整数x是3的倍数的条件是x每一位加起来的和是3的倍数.反之,如果一个数每一位加起来是3的倍数,则这个数肯定是3的倍数.现在给定进制P,求有多少个B满足P进制下,一个正整数是B的倍数的充分必要条件是每一位加起来的和是B的倍数. Input 第一行一个正整数T表示数据组数(1<=T<=20).接下来T行,每行一个正整数P(

nyoj 48小明的调查作业

 小明的调查作业 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 小明的老师布置了一份调查作业,小明想在学校中请一些同学一起做一项问卷调查,聪明的小明为了实验的客观性,想利用自己的计算机知识帮助自己.他先用计算机生成了N个1到1000之间的随机整数(0<N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成"去重"与"

nyoj 1077 小博弈 【另类巴什博奕】

分析:分析当整除(a+b)的时候肯定是后者胜利,如果余数不等于0的时候,如果余数大于b肯定是前者胜利,否则后者胜利. 代码: import java.math.*; import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner cin = new Scanner(System.in); BigInteger n, a, b; while(cin.hasNext()){ n

NYOJ 881 小m的区间公约数

#include<stdio.h>int t,num,l,r,a,b,i,max,flag;int temp;int gcd(int n,int m){ if(n<m) { t=n; n=m; m=t; } while(n!=0) { r=m%n; m=n; n=r; } return (m);}int main(){ while(~scanf("%d%d",&a,&b)) { temp=gcd(a,b); scanf("%d",&

NYOJ 144 小珂的苦恼【扩展gcd】

题目链接 /* 对于gcd(a,b)=ax+by,存在唯一的x和y使等式成立 */ #include<stdio.h> int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int s,p; int a,b,n; scanf("%d",&s); while(s--) { scanf("%d%d%d",&a,&b,&n); p=gcd(a,b); if

数论初步(费马小定理) - Happy 2004

Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29). Take X = 1 for an example. The positive integer divisors of 2004^1

HDU - 1098 - Ignatius&#39;s puzzle (数论 - 费马小定理)

Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7012    Accepted Submission(s): 4847 Problem Description Ignatius is poor at math,he falls across a puzzle problem,so he has no

初等数论及其应用——费马小定理

费马小定理在化简数论问题有着广泛用途.