小M的因子和

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
 
描述

小M在上课时有些得意忘形,老师想出道题目难住他。小M听说是求因子和,还是非常得意,但是看完题目是求A的B次方的因子和,有些手足无措了,你能解决这个问题吗?

 
输入
有多组测试样例
每行两个数 A ,B ,(1≤A,B≤10^9) 
输出
输出A的B次方的因子和,并对9901取余。
样例输入
2 3
样例输出
15
上传者
Sumdiv
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 13547   Accepted: 3321

Description

Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).

Input

The only line contains the two natural numbers A and B, (0 <= A,B <= 50000000)separated by blanks.

Output

The only line of the output will contain S modulo 9901.

Sample Input

2 3

Sample Output

15

Hint

2^3 = 8. 
The natural divisors of 8 are: 1,2,4,8. Their sum is 15. 
15 modulo 9901 is 15 (that should be output). 

Source

都是一样的。

 /**
这道题,类似于hdu happy 2004.
这题是一个通法。
A^B%P,
拆分A变成素数,因为素数满足因子之和 s(x*y)=s(x)*s(y);
更重要的是,素数的x^n的因子个数是可以求出来的。就是
和(x^n) = 1 + x + x^2 +x^3 +......+x^n; 这样的话,我们就可以轻松解决这样的一个问题了。
提供两种思路。
1 + x + x^2 +x^3 +......+x^n,直接求它对%p的值。运用快速幂也可以的。
这就是第一种方法,也是下面的ac方法。 第二种方法:1 + x + x^2 +x^3 +......+x^n= 等比数列前n+1和。
很据 S(p^X)=1+p+p^2+...+p^X = (p^(X+1)-1)/(p-1);
这样就等于求这个式子了。好的,怎么求呢? p^(X+1)-1 这个应该没有问题,快速幂取模
关键是1/(p-1); 这个不能直接取模。转化为求乘法的逆元。 乘法的逆元??恩。
一开始,我就是这样做的,后来想用费马小定理,联想到了一道题C(n,m)的求法时候
也出现过 n!/(m!*(n-m)!) 对于费马小定理 a%p == a^p-1%p; 那么这样的话,我就能
转化一下,对于 1/(p-1) ,转化为 (p-1)^-1 ==> (p-1)^-1 % mod = (p-1)^mod-2 %mod; 好像这样是对的,是的。
费马小定理的前提是什么? mod是一个素数,这个满足了。
还有一个条件gcd(mod,p-1)==1 这个就不一定了.当p为 mod的倍数+1而且是素数的时候。
就很感慨的发现,p-1就是mod的倍数。
那么费马小定理的路,就不好走了。 那我用扩展欧几里得的算法来求逆元。我看到很多人的解题思路可能都是这个吧。
其实,我依然有一个疑问。
对于(p^(X+1)-1)/(p-1),显然我能对其转化 p%Euler(mod) == t
==> (t ^(x+1)-1)/(t-1); 但是如果 t ^(x+1)%p 为1的时候,这个值就为0了。 例子 A B P
59407 1 9901
**/ #include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<vector>
using namespace std;
typedef long long LL; const LL p = ;
LL prime[],len;
LL num[];
LL dp[],dlen;
void Euler(LL n)
{
LL i,k;
len=;
for(i=; i*i<=n;i++)
{
if(n%i==){
k=;
while(n%i==){
n=n/i;
k++;
}
prime[++len]=i%p;
num[len]=k;
}
}
if(n!=){
prime[++len]=n%p;
num[len]=;
}
}
LL sum_mod(LL a,LL n)
{
LL ans=;
n=n%p;
while(n)
{
if(n&) ans=(ans+a)%p;
n=n>>;
a=(a+a)%p;
}
return ans;
}
LL solve(LL a,LL n)
{
LL p1=a,p2=a,ans,i;
dlen=;
while(n)
{
dp[++dlen]=(n&);
n=n>>;
}
ans=dlen-;
for(i=ans;i>=;i--)
{
p1=sum_mod(p1,p2+);
p2=sum_mod(p2,p2);
if(dp[i]==)
{
p2=sum_mod(p2,a);
p1=(p1+p2)%p;
}
}
return (p1+)%p;
}
int main()
{
LL n,m,i;
while(scanf("%lld%lld",&n,&m)>)
{
if(n==){
printf("0\n");
continue;
}
else if(m==)
{
printf("1\n");
continue;
}
Euler(n);
LL hxl=;
for(i=;i<=len;i++)
{
hxl=(hxl*solve(prime[i],num[i]*m))%p;
}
printf("%lld\n",hxl);
}
return ;
}

nylg 小M的因子和的更多相关文章

  1. CF GYM 100703L Many questions

    题意:题意真坑……龙要问一系列问题,王子骑士公主分别以一个整数回答,如果王子和公主答案差的绝对值比骑士和公主答案差的绝对值小则说王子和公主的答案更相似,反过来如果前者比后者大则说骑士和公主的答案更相似 ...

  2. 用C#制作推箱子小游戏

    思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图  (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...

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

    Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2 ...

  4. 洛谷P1593 因子和

    题目描述 输入两个正整数a和b,求a^b的因子和.结果太大,只要输出它对9901的余数. 输入输出格式 输入格式: 仅一行,为两个正整数a和b(0≤a,b≤50000000). 输出格式: a^b的因 ...

  5. 胡小兔的 PKUSC2018 游记

    Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...

  6. lesson4-图像分类-小象cv

    CNN网络进化:AlexNet->VGG->GoogleNet->ResNet,深度8->19->22->152GoogleNet:Lsplit->trans ...

  7. 第一个mpvue小程序开发总结

    前言 说起小程序,其实在去年我都还只试着照着官方文档写过demo的,不过现在这家公司小程序做得比较多,我来之后也参与了几个小程序的开发了,最开始那几个是用的wepy,最近一个开始转用mpvue开发,最 ...

  8. hdu 1215(因子和)

    七夕节 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. 用RecyclerView做一个小清新的Gallery效果

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

随机推荐

  1. c++之路起航——指针

    c++一阶指针 定义 存储类型名 数据类型 * 指针变量名: Eg:int *a://定义了一个指向整型的指针 a: 指针使用方法 int a,*b; b=&a;//表明将a的地址赋值给b: ...

  2. docker进入容器方法

    更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中. $ wget -P ~ https://github.com/yeasy/docker_practice/ra ...

  3. java将数组中的零放到末尾

    package com.shb.java; /** * 将数组中的0放到数组的后边,然后原来的非零数的顺序不改变 * @author BIN * */ public class Demo2{ publ ...

  4. js获取url的参数值

    var match = new RegExp('[?&]voucherSn=([^&]*)').exec("http://m.v3beta.tootoo.cn/index.p ...

  5. C语言初学者代码中的常见错误与瑕疵(13)

    https://www.cpfn.org/bbs/viewtopic.php?f=85&t=5940&sid=ccbcf716d21191452e7c08a97b502337& ...

  6. 常用的I/O流类型

    1.I/O流类型基础.(类中方法和子类查看java spring API) 抽象类java.io.InputStream:是所有字节输入流的父类,定义了以字节为基本单位读取数据的基本方法 抽象类jav ...

  7. UIImageView(转)

    UIImageView,顾名思义,是用来放置图片的.使用Interface Builder设计界面时,当然可以直接将控件拖进去并设置相关属性,这就不说了,这里讲的是用代码. 1.创建一个UIImage ...

  8. Hadoop入门实践之从WordCount程序说起

    这段时间需要学习Hadoop了,以前一直听说Hadoop,但是从来没有研究过,这几天粗略看完了<Hadoop实战>这本书,对Hadoop编程有了大致的了解.接下来就是多看多写了.以Hado ...

  9. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

  10. UIView完全置顶的方法

    一般来说,若需要独立添加一个UIView,使其覆盖于整个应用窗口之上,是这样实现的: AppDelegate *app = (AppDelegate *)[[UIApplication sharedA ...