Sumdiv(较难数学题)
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 20971 | Accepted: 5290 |
Description
Input
Output
Sample Input
2 3
Sample Output
15
Hint
The natural divisors of 8 are: 1,2,4,8. Their sum is 15.
15 modulo 9901 is 15 (that should be output).
void Zhi()
{
int t = a;
for (int i=;i*i<=a;i++)
{
if (t%i==)
{
p[z]=i;
p_n[z]=;
t/=i;
while (t%i==)
{
p_n[z]++;
t/=i;
}
z++;
}
if (t==) break;
if (i!=)
i++;//2.3.5.7.9...
}
if (t!=)//本身就是质数
{
p[z]=t;
p_n[z]=;
z++;
}
}
对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)
有 A 的所有因子之和为
S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+…+p2^k2) * (1+p3+ p3^3+…+p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)
但是,使用这个公式不能用等比求和公式,因为我们要求余,等比数列求和公式求余就错了
所以用到了二分求等比数列和
用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n:
(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+b)%m=(a%m+b%m)%m
(a*b)%m=(a%m*b%m)%m
还有<快速幂>
应该不难,看看代码能懂
int Mi(int a, int b)//快速幂
{
int res = ;
a %= MOD;
while (b)
{
if (b%==)
res = (res * a)%MOD;
a = (a * a)%MOD;
b /= ;
}
return res;
}
好了,递归二分代码
int Erfen(int p , int n)//求 1 + p + p^2 + p^3+ ... +p^n
{
if (n==) return ;
if (n%==)
return ((Mi(p,n/+)+) * Erfen(p,n/))%MOD;
else
return ((+Mi(p,n/+)) * Erfen(p,n/-) + Mi(p,n/))%MOD;
}
上总代码:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; #define MOD 9901 int a,b,z;
int p[]; //质数
int p_n[];//质数个数 void Zhi()
{
int t = a;
for (int i=;i*i<=a;i++)
{
if (t%i==)
{
p[z]=i;
p_n[z]=;
t/=i;
while (t%i==)
{
p_n[z]++;
t/=i;
}
z++;
}
if (t==) break;
if (i!=)
i++;//2.3.5.7.9...
}
if (t!=)//本身就是质数
{
p[z]=t;
p_n[z]=;
z++;
}
} int Mi(int a, int b)//快速幂
{
int res = ;
a %= MOD;
while (b)
{
if (b%==)
res = (res * a)%MOD;
a = (a * a)%MOD;
b /= ;
}
return res;
} int Erfen(int p , int n)//求 1 + p + p^2 + p^3+ ... +p^n
{
if (n==) return ;
if (n%==)
return ((Mi(p,n/+)+) * Erfen(p,n/))%MOD;
else
return ((+Mi(p,n/+)) * Erfen(p,n/-) + Mi(p,n/))%MOD;
} int main()
{
while (scanf("%d%d",&a,&b)!=EOF)
{
z=;//质数个数
Zhi(); int ans = ;
for (int i=;i<z;i++)
{
ans = (ans * Erfen(p[i],p_n[i]*b))%MOD;
}
printf("%d\n",ans);
}
return ;
}
Sumdiv(较难数学题)的更多相关文章
- SAT考试里最难的数学题? · 三只猫的温暖
问题 今天无意中在Quora上看到有人贴出来一道号称是SAT里最难的一道数学题,一下子勾起了我的兴趣.于是拿起笔来写写画画,花了差不多十五分钟搞定.觉得有点意思,决定把解题过程记下来.原帖的图太小,我 ...
- CF 327D - Block Tower 数学题 DFS 初看很难,想通了就感觉很简单
D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- poj1845 Sumdiv
poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...
- NEFU 117 - 素数个数的位数 - [简单数学题]
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=117 Time Limit:1000ms Memory Limi ...
- NYOJ 330 一个简单的数学题【数学题】
/* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...
- LG2662 牛场围栏 和 test20181107 数学题
P2662 牛场围栏 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后 ...
- 微信群里一道六年级数学题,求阴影面积,那我只能用python代码了
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- C. Tourist Problem 2021.3.29 晚vj拉题 cf 1600 纯数学题
拉题链接 https://vjudge.net/contest/430219#overview 原题链接 https://codeforces.com/problemset/problem/340 ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
随机推荐
- C# this.Invoke()的作用与用法
Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); 在多线程编程中,我们经常要在工作线程 ...
- Java程序猿修炼之道 之 Logging(3/3) - 怎么分析Log
1. 说明 作为一个程序猿我们常常要做一件事情:获取某个Log文件,从当中找出自己想要的信息. 本文总结了我在工作中使用了哪些工具来分析Log文件获取我想要的信息,我近期几年的工作环境都是server ...
- Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
Elasticsearch 的查询很灵活,并且有Filter,有分组功能,还有ScriptFilter等等,所以很强大.下面上代码: 一个简单的查询,返回一个List<对象> .. ...
- 怎样优雅的研究 RGSS3 (四) 使窗体从画面边缘弹出
在非常多游戏中,窗体能够从游戏画面的边缘弹出. 而在 RGSS3 的默认脚本中时没有这样的功能的,当在地图上按下取消键时.游戏菜单会突然出现. 如今我们能够为主菜单加入动画效果,使其在屏幕边缘弹出. ...
- rpc接口mock平台
转载:http://blog.csdn.net/ronghuanye/article/details/71124320 1.简介 平台采用struts.spring.mybatis框架开发设计,主要用 ...
- azkaban2.5 具体配置以及使用方式
azkaban支持shell.java.mapreduce以及hive的工作流调度,在对这些不同类型任务调度之前须要配置所相应的插件:azkaban总体分为两部分azkaban executor se ...
- Laravel之命令
一.创建命令 php artisan make:console SendEmails 上述命令将会生成一个类app/Console/Commands/SendEmails.php,当创建命令时,--c ...
- Oracle创建表空间与用户
/* 说明:若已经存在相应的用户和表空间,则需要先删除相应的用户和表空间 然后再全部重新建立 */ --删除用户 drop user XDAYWEIXIN cascade; --删除表空间 drop ...
- [JAVA · 0基础]:11.终结者-final
关于finalkeyword的总结,是非常easy学习和掌握的,大致分为用final修饰的符号常量.类.方法.属性四部分.而这四部分的内容也是我们必须掌握的,非常有用.在项目中常常来利用finalke ...
- zabbix web monitoring 监控网页
配置 Web 场景 配置 web 场景: 转到: 配置 (Configuration)–>主机 (或者 模板 ) 点击主机 (host)/ 模板 (template) 行中的 Web 点击右上角 ...