约数和

题目描述

给出a和b求a^b的约数和。

输入格式:

一行两个数a,b。

输出格式:

一个数表示结果对 9901 的模。

Input

2 3

Output

15

SB的思路:

这是一道典型的数论题,本蒟蒻在做的时候首先瞄出a为质数的解法(简直废话,是个人都看得出),

sum(a,b)=a^0+a^2+a^3+···+a^(b-1)+a^b,然后自以为搞出了什么,结果随手举个反例就Wa了,但是很明显也很容易想到要用快速幂。

然后我又想到洛谷月赛T1,以及一道要用到费马小定理的题目,加上我打出的表,我发现:

 a=(a1^k1)*(a2^k2)*···*(an^kn)   (其中a1为质因子,k1为该质因子个数)

那么a^b=(a1^k1)^b*(a2^k2)^b*···*(an^kn)^b

再加上质数的约数和的规律我的表

a^b的约数和(暂且用sum表示)就是sum(a,b)=sum(a1,k1*b)*sum(a2,k2*b)*···*sum(an,kn*b)

然后我很愚蠢地使用只快速幂来求约数和,这个想法太愚蠢了我都没脸说(我当时是这样想的:a^b的约数和做两次快速幂就出来了,即在做a^b和a^(b-1)的过程中累加ans值,然后当b-1或b等于0的时候特判一下,本蒟蒻果然没有摸清快速幂的原理。。。),然后又被自己的样例否决了。

想不出正解我就只好暴力,然后在洛谷上水了30分,而我打出的伪正解只有10分

正确思路:

话说我似乎跑偏了,那么上最正确的解题思路(http://www.cnblogs.com/neopenx/p/4094705.html):

事实上最重要的是约数和公式:

①整数唯一分解定理:

一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式。其中Pn为素数。

如2004=(22)*3*167

那么2004x=(22x)*(3x)*(167x)

②约数和公式

对于一个已经被分解的整数A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn),

有约数和S=(1+P12+P13+.....P1k1)*.....(1+Pn2+Pn3+.....Pnkn)。

(1+P12+P13+.....P1k1)是一个等比数列,化简为(P1k1+1 -1)/(P1-1),由于有除法同余式,很容易想到乘法逆元。

但是这题和HDU 1452不同,对于逆元表达式ax=1 mod n,乘法逆元存在的条件是gcd(a,n)=1,即a,n互质,但是这题的gcd(P1-1,9901)≠1, 所以不能用乘法逆元求解。

所以有必要对等比数列求和公式改一改:

(1)若n为奇数,一共有偶数项,则:
      1 + p + p^2 + p^3 +...+ p^n

      = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))
      = (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

上式红色加粗的前半部分恰好就是原式的一半,后半部分递归求解即可。

(2)若n为偶数,一共有奇数项,则:
      1 + p + p^2 + p^3 +...+ p^n

      = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)
      = (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

这样,在对A质因数分解后,对于每一个质因数,累乘sum(质因数,次数)%mod即可,注意sum计算的时候都要mod防止溢出。

注意一下A的范围,A=0或A=1时无法分解质因数,所以特判结果分别是0和1。

根据以上定理,不难发现这道题非常之水,但是数论太渣,所以公式也没有推到底,再加上自己对快速幂的理解不够深刻,以我的智力是打不出正解的。。。

代码:

 #include<iostream>
#include<cstdio>
const long long mod=;
using namespace std;
long long zs[],gs[];
long long n,m,p,Ans,s;
long long mmp[];
void f(long long num) //求a的质因子和该质因子的个数
{
long long i,j=;
for(i=;i*i<=num;i++)
{
if(num%i==)
{
long long count=;
zs[++j]=i;
while(num%i==)
{
count++;
num/=i;
}
gs[j]=count; }
}
if(num>)
{
zs[++j]=num;
gs[j]=;
}
s=j;
}
long long ksm(long long a,long long b) //快速幂,注意要边乘边模
{
long long ans=,base=a;
long long f=;
while(b>)
{
if(b%!=)
ans=(ans*base)%mod;
base=(base*base)%mod;
b/=;
}
return ans;
}
long long sum(long long p,long long k) //递推求约数和公式前一部分
{
if(k==) return ;
if(k%) return ((sum(p,k/)*(+ksm(p,k/+)))%mod);
else return ((sum(p,k/-)*(+ksm(p,k/+))+ksm(p,k/))%mod);
}
int main()
{
scanf("%lld%lld",&n,&m);
Ans=;
if(m==) //特判一下
{
printf("");
return ;
}
f(n);
for(int i=;i<=s;i++)
{
Ans=(Ans*(sum(zs[i],gs[i]*m)%mod))%mod; //约数和公式
}
printf("%lld",Ans);
return ;
}

这道题似乎有三种做法,大部分是用的以上这种,毕竟很好想到,若是知道约数和公式就非常轻松了,不知道约数和公式也可以推出来(像我这种地表最弱蒟蒻就算了)

还有一种较为常见的就是逆元,但我一个同学说他直接用快速幂求sum(a1,(k1^b)%mod)过了。。。

这篇博客我逼逼得有点多,见谅。

POJ 1845 (洛谷 :题目待添加)Sumdiv的更多相关文章

  1. 洛谷 P1593 因子和 || Sumdiv POJ - 1845

    以下弃用 这是一道一样的题(poj1845)的数据 没错,所有宣称直接用逆元/快速幂+费马小定理可做的,都会被hack掉(包括大量题解及AC代码) 什么原因呢?只是因为此题的模数太小了...虽然990 ...

  2. poj 1717==洛谷P1282 多米诺骨牌

    Dominoes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6571   Accepted: 2178 Descript ...

  3. POJ 3274/洛谷 1360:Gold Balanced Lineup 黄金阵容平衡

    题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to na ...

  4. poj 3422 洛谷P2045 K取方格数(方格取数加强版)

    Description: 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来 ...

  5. 洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)

    洛谷题目传送门 顺便提一下题意有一个地方不太清楚,就是如果输出No还要输出最少需要添加多少张牌才能满足要求.蒟蒻考完以后发现四个点Too short on line 2... 比较需要技巧的搜索 既然 ...

  6. LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)

    LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...

  7. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  8. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)

    洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...

  9. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

随机推荐

  1. NFS和mount常用参数详解 本文目录

    NFS和mount常用参数详解   本文目录 NFS权限参数配置 mount挂载参数 原始驱动程序的挂载选项. 新驱动程序的挂载选项. 怎样改变已经挂载的NTFS卷的权限? 怎样自动挂载一个NTFS卷 ...

  2. Windows API 第三篇

    1.获得程序自身的路径: DWORD GetModuleFileName( HMODULE hModule, // handle to module LPTSTR lpFilename, // pat ...

  3. 05.Hibernate常用的接口和类---Configuration类和作用

    Configuration作用: 加载Hibernate配置文件,可以获取SessionFactory对象 加载方式: 1.加载配置文件 Configuration configuration = n ...

  4. 一些常见的synthesis attribute

    Noprune A Verilog HDL synthesis attribute that prevents the Quartus II software from removing a regi ...

  5. 深入浅出 Java Concurrency (14): 锁机制 part 9 读写锁 (ReentrantReadWriteLock) (2)[转]

    这一节主要是谈谈读写锁的实现. 上一节中提到,ReadWriteLock看起来有两个锁:readLock/writeLock.如果真的是两个锁的话,它们之间又是如何相互影响的呢? 事实上在Reentr ...

  6. Tool-MySQL-SQLyog:SQLyog

    ylbtech-Tool-MySQL-SQLyog:SQLyog SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,由业界著名的Webyog公司出 ...

  7. request.getSession().getServletContext().getRealPath("upload/" ); 获取不到 tomcat 服务器目录

    上传一个文件,找不到该文件的位置 设置上传的文件是在项目中的话 可以通过查找项目的路径锁定上传的文件路径 解决步骤: 可以通过jsp页面 打印获取项目的物理路径 控制台即可输出项目路径 这只是找了了上 ...

  8. 数据交换格式之 - XML

    XML简介 XML是一种可扩展的标记语言,被设计用来传输和存储数据.传输数据. 需要自定义标签,自我描述性,XML是W3C的推荐标准: XML的特点与作用 特点: xml与操作系统.编程语言的开发平台 ...

  9. spring-jdbc-aop事务

    1 spring整合JDBC 1.1 概述 spring提供了很多模板整合Dao技术  spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => J ...

  10. <init>与<clinit>的区别

    在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法<clinit>, 另一个是实例的初始化方法<init> <clinit>:在jvm第一次加载c ...