POJ 1845 (洛谷 :题目待添加)Sumdiv
约数和
题目描述
给出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的更多相关文章
- 洛谷 P1593 因子和 || Sumdiv POJ - 1845
以下弃用 这是一道一样的题(poj1845)的数据 没错,所有宣称直接用逆元/快速幂+费马小定理可做的,都会被hack掉(包括大量题解及AC代码) 什么原因呢?只是因为此题的模数太小了...虽然990 ...
- poj 1717==洛谷P1282 多米诺骨牌
Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6571 Accepted: 2178 Descript ...
- 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 ...
- poj 3422 洛谷P2045 K取方格数(方格取数加强版)
Description: 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来 ...
- 洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)
洛谷题目传送门 顺便提一下题意有一个地方不太清楚,就是如果输出No还要输出最少需要添加多少张牌才能满足要求.蒟蒻考完以后发现四个点Too short on line 2... 比较需要技巧的搜索 既然 ...
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
随机推荐
- 2019-2-13-Latex-论文elsevier,手把手如何用Latex写论文
title author date CreateTime categories Latex 论文elsevier,手把手如何用Latex写论文 lindexi 2019-02-13 10:38:20 ...
- [转]C#委托的异步调用
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...
- 修改linux命令行的提示符PS1
# If not running interactively, don't do anything [ -z "$PS1" ] && return # check ...
- Creating a bootable Ubuntu USB stick
Windows: https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows#0 Ubuntu: http ...
- day66作业
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C语言复制数组
直接上代码,分别是栈上开辟内存,堆上开辟内存 #include <stdio.h> #include <stdlib.h> void test01(){ ]; printf(& ...
- Django项目:CRM(客户关系管理系统)--80--70PerfectCRM实现CRM业务流程(bpm)课程排行分页
# coursetop_views.py # ————————64PerfectCRM实现CRM课程排名详情———————— #————班级学生详情——#计算#{学员ID:分数}——#计算 #{学员I ...
- Django项目:CRM(客户关系管理系统)--77--67PerfectCRM实现CRM课程出勤排名
# classtop_urls.py # ————————64PerfectCRM实现CRM课程排名详情———————— from django.conf.urls import url from b ...
- 结构体的sort排序
结构体用sort快排的方法 struct node{ int k,s; }p[]; bool cmp1(node x,node y){ return x.s>y.s; //定义降序排序(从大到小 ...
- MVC模式 - Model-View-Controller -(模型-视图-控制器)
MVC(Model View Controller) MVC是一种设计典范.它是用一种业务逻辑.数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件上,在需要改进和个性化定制界面及用户交 ...