POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)
题目描述
给定A,B,求A^B的所有因数的和,再MOD 9901
输入
一行两个整数 A 和 B。
输出
一行,一个整数
样例输入
2 3
样例输出
15
提示
对于100%的数据满足:0 <= A,B <= 50000000
这道题首先要想到有一个因数和公式
f[a] = ( 1 + p1 + p1^2 + .... + p1^q1 ) * ( 1 + p2 + p2^2 + .... + p2^q2 ) * ...... * ( 1 + pn + pn^2 +.....+ pn^qn )
由此我们知道,这道题需要分解质因数(唯一分解定理???
A^B可以直接分A,每个分出数的指数再×B就行(这应该都会
所以我们可以先打个素数表..
因为a,b都在50000000,计算器一算7000多的表就够了..
我们再观察因数和公式,如果一个一个求救太麻烦了,我们就发现了这是等比数列啊!!!
等比数列公式相信大家都会...
因为除数可能为负数,所以式子要上下都×-1整理一下
但这又有可能出现不是整数的情况,我们就需要用乘法逆元了(当时我卡在这了
这里先贴一个写的挺好的乘法逆元
inline long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
if(a==&&b==)
return -1ll;
if(b==)
{
x=1ll;
y=0ll;
return a;
}
long long d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
inline long long mod_reverse(long long a,long long n)
{
long long x,y,d=extend_gcd(a,n,x,y);
if(d==)
return (x%n+n)%n;
else
return -1ll;
}
快速幂和乘法取模就不说了
下面贴代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
ll vis[]={};
ll ys[]={},zs[]={};
ll vis1[]={};
ll ac[]={};
using namespace std;
ll n;
ll qmod(ll i,ll j)
{
ll ans=;
while(j)
{
if(j&)
{
ans*=i;
ans%=;
}
i=i*i%;
j>>=;
}
return ans%;
}
void prime()
{
ll i,j,k=;
for(i=;i<=;i++)
{
vis[i]=i;
}
i=;
while(i*i<=)
{
if(vis[i]!=)
{
j=i<<;
while(j<=)
{
if(vis[j]!=)
{
k++;
}
vis[j]=;
j=j+i;
}
}
i++;
}
}
int main()
{
ll k=;
ll i,j;
ll A,b;
ll a,n;
cin>>a>>b;
A=a;
n=sqrt(a);
prime();
for(i=;i<=n;i++)
{
while((vis[i]!=)&&(a%vis[i]==))
{
vis1[i]=;
ys[k]=vis[i]%;
zs[k]++;
a=a/vis[i];
}
if(vis1[i]==)
{
k++;
}
}
k--;
ll step=;
ll re=,cf=;
if(a!=&&a!=A)
{
ys[k+]=a%;
zs[k+]=;
step=;
}
else
if(a==A)
{
ys[]=a%;
zs[]=;
k=;
}
if(step==)
{
k++;
}
ll count=;
for(i=;i<=k;i++)
{
if(zs[i]!=)
{
zs[i]=zs[i]*b;
count++;
}
}
for(i=;i<=count;i++)
{
ll a1=qmod(ys[i]%,zs[i]+);
a1=a1-;
ll temp=(ys[i]-)%;
ll a2=qmod(temp,);
ac[i]=((a1%)*(a2%))%;
}
ll sum=ac[];
for(i=;i<=count;i++)
{
sum=((sum%)*(ac[i]%))%;
}
cout<<sum;
}
POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)的更多相关文章
- poj 1845 POJ 1845 Sumdiv 数学模板
筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...
- poj 1845 Sumdiv (数论)
题目链接 题意:求 A^B的所有约数之和对9901取模后的结果. 分析: 看了小优的博客写的. 分析来自 http://blog.csdn.net/lyy289065406/article/detai ...
- POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...
- poj 1845 Sumdiv 约数和定理
Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...
- poj 1845 Sumdiv(约数和,乘法逆元)
题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...
- POJ 1845 Sumdiv(求因数和 + 逆元)题解
题意:给你a,b,要求给出a^b的因子和取模9901的结果. 思路:求因子和的方法:任意A = p1^a1 * p2^a2 ....pn^an,则因子和为sum =(1 + p1 + p1^2 + . ...
- POJ 1845 Sumdiv 【二分 || 逆元】
任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...
- POJ 1845 Sumdiv(逆元)
题目链接:Sumdiv 题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值. 题解:了解下以下知识点 1.整数的唯一分解定理 任意正整数都有且只有唯一的方式 ...
- POJ 1845 Sumdiv (整数唯一分解定理)
题目链接 Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25841 Accepted: 6382 Desc ...
- 【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)
题目: POJ1845 分析: 首先用线性筛把\(A\)分解质因数,得到: \[A=p_1^{a_1}*p_2^{a_2}...*p_n^{a_n} (p_i是质数且a_i>0) \] 则显然\ ...
随机推荐
- Hadoop集群
你可以用以下三种支持的模式中的一种启动Hadoop集群: 单机模式 伪分布式模式 完全分布式模式 单机模式的操作方法 默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程.这对调试 ...
- Java基础之equals方法和"= ="的区别
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符. 如果一个变量指向的数据是对象类型的 ...
- Windows上Ruby开发环境的配置
最近公司项目上有需要,需要开发一个puppet的自动化工具,这个工具需要操作存储设备上的各种资源,而鉴于puppet不是善于完成这个任务的首选语言,于是我们选择了puppet的“爹”,Ruby. 熟悉 ...
- 用Python设计一个经典小游戏
这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...
- Springboot基础篇
Springboot可以说是当前最火的java框架了,非常适合于"微服务"思路的开发,大幅缩短软件开发周期. 概念 过去Spring充满了配置bean的xml文件,随着spring ...
- SQL Server中INNER JOIN与子查询IN的性能测试
这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...
- gitlab 添加SSH Key
1.登录http://domain/users/sign_in 2.选择"Profile Settings",进入"Profile Settings"设置页面 ...
- vim 编辑中执行正则表达式
1.进入vim 编辑模式 2.输入:set magic 3.输入/,然后再次输入正则表达式
- linux系统管理--进程管理
这两天一直维护公司的服务器,主要对进程管理和linux工作管理,把一些零散的知识整理一下,书归正传~ 什么进程? 以下是百度给的解释的进程,说实话,云里雾里的,其实linux进程和windows进程 ...
- nginx+tomcat集群负载均衡(实现session复制)
转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面( ...