1633:【例 3】Sumdiv

时间限制: 1000 ms         内存限制: 524288 KB

【题目描述】

原题来自:Romania OI 2002

求 ABAB 的所有约数之和 mod9901。

【输入】

输入两个整数 A,B。

【输出】

输出答案 mod9901。

【输入样例】

2 3

【输出样例】

15

【提示】

样例说明

23=8,8 的所有约数为 1,2,4,8,1+2+4+8=15,15mod9901=15,因此输出 15。

数据范围与提示:

对于全部数据,0≤A,B≤5×107

sol:写了半天几乎吐血终于水过这道板子题

首先有个很显然的东西

对于一个数

如果他是p1a1*p1a2*p3a3*~~*pnan

那么他的因数和就是 (p10+p11+p12+...+p1a1)*(p20+p21+...+p2a2)*...*(pn1+pn2+...+pnan

于是这道题就是要把所有质因数的幂次的乘积,先来推一下等比公式

令 S = p0+p1+p2+...+pa,       (1)

则p*S = p1+p2+...+pa+pa+1,   (2)

(2)-(1)可以得到 S*(p-1) = pa+1-p0,所以S= (pa+1-p0)/ (p-1) ,前面一项显然Ksm就可以解决,考虑后一项

需要用到p-1的逆元,如何求呢??

定义一个数a(就求a的逆元)

对于任意一个数 X/a ≡ X*Inva  (%Mod)

易知 a*Inva ≡ 1 (%Mod)

随便推导下

原式: a*Inva = 1 (%Mod)
--> a*Inva-k*Mod = 1 (%Mod)
--> a*Inva+P*Mod = 1 (%Mod) (类ax+by=c的形式)

配上巨丑无比的代码

/*
原式: a*Inva = 1 (%Mod)
--> a*Inva-k*Mod = 1 (%Mod)
--> a*Inva+P*Mod = 1 (%Mod) (类ax+by=c的形式)
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll Mod=;
ll A,B;
int cnt=;
struct Prime
{
ll Shuz,Xis;
}Prim[];
inline ll Ksm(ll x,ll y)
{
ll ans=;
while(y)
{
if(y&)
{
ans=ans*x%Mod;
}
x=x*x%Mod;
y>>=;
}
return ans;
}
ll gcd(ll x,ll y)
{
return (!y)?(x):(gcd(y,x%y));
}
inline void Exgcd(ll a,ll b,ll &X,ll &Y)
{
if(b==)
{
X=;
Y=;
return;
}
Exgcd(b,a%b,X,Y);
ll XX=X,YY=Y;
X=YY;
Y=XX-a/b*YY;
return;
}
//a*Inva+Mod*k = 1 (%Mod)
inline ll Inv(ll Num)
{
ll a,b,c,r,X,Y;
a=Num;
b=Mod;
c=;
r=gcd(a,b);
Exgcd(a,b,X=,Y=);
X=X*r/c;
ll tmp=b/r;
X=(X>=)?(X%tmp):(X%tmp+tmp);
// printf("X=%lld Test=%lld\n",X,Num*X%Mod);
return X;
}
inline void Solve(ll Num)
{
int i;
for(i=;i<=sqrt(Num);i++)
{
if(Num%i==)
{
Prim[++cnt].Shuz=i;
Prim[cnt].Xis=;
while(Num%i==)
{
Prim[cnt].Xis++;
Num/=i;
}
Prim[cnt].Xis*=B;
}
}
if(Num>)
{
Prim[++cnt]=(Prime){Num,B};
}
return;
}
int main()
{
int i;
ll ans=1ll;
R(A); R(B);
Solve(A);
for(i=;i<=cnt;i++)
{
// printf("%lld %lld\n",Prim[i].Shuz,Prim[i].Xis);
ll tmp=(Ksm(Prim[i].Shuz,Prim[i].Xis+)-+Mod)%Mod;
tmp=tmp*Inv(Prim[i].Shuz-)%Mod;
ans=ans*tmp%Mod;
}
Wl(ans);
return ;
}
/*
input
2 3
output
15 input
10 6
output
5187 input
45279441 39876543
output
6060 input
9 8
output
5660
*/

一本通1633【例 3】Sumdiv的更多相关文章

  1. YBT 1633:【例 3】Sumdiv

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1633 A^B 快速幂求结果,所有约数和,可以通过组合来进行得到. 技巧,通过递归得到1~n次的和.su ...

  2. 1633:【例 3】Sumdiv

    #include<bits/stdc++.h> #define ll long long using namespace std; ; ll a,b,ans=,cnt; ll p[],c[ ...

  3. 【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】

    1329:[例8.2]细胞 [题目描述] 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 023 ...

  4. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  5. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  6. 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

    题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...

  7. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  8. 「LOJ#10034」「一本通 2.1 例 2」图书管理 (map

    题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需 ...

  9. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

随机推荐

  1. 清北学堂寒假集训DAY1

    第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...

  2. android studio更新gradle失败的解决办法-转

    android studio中每次自动更新gradle时速度实在太慢因为gradle服务器比较慢,所以更新gradle会比较慢,建议先下载下来,然后手动添加到gradle的下载目录,提升速度. 使用下 ...

  3. 20155239吕宇轩《网络对抗》Exp3 免杀原理与实践

    20155239吕宇轩<网络对抗>Exp3 免杀原理与实践 实验过程 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.virscan.o ...

  4. 使用 restTemplate 实现get/post 请求

    get 请求(这里是在 idea 的 test包中,所以需要直接 new RestTemplate() ) 即:RestTemplate restTemplate = new RestTemplate ...

  5. idea 项目java版本选项位置

    藏这里了 还有一个

  6. ES6 箭头函数易出错细节

    箭头函数表达式的语法比函数表达式更短,并且没有自己的this,arguments,super或 new.target. 箭头函数基本语法 (参数1, 参数2, -, 参数N) => { 函数声明 ...

  7. Scrapy爬虫入门实例

    网上关于Scracpy的讲述已经非常丰富了,而且还有大神翻译的官方文档,我就不重复造轮子了,自己写了一个小爬虫,遇到不少坑,也学到不少东西,在这里给大家分享一下,自己也做个备忘录. 主要功能就是爬取c ...

  8. 阿里云ESC入网和出网指的什么

    什么是入网带宽和出网带宽 云服务器 ECS 的入网带宽和出网带宽皆以服务器角度出发.下表给出了入网带宽和出网带宽的具体内容: 带宽类别 (Mbit/s) 描述 入网带宽 流入云服务器 ECS 的带宽从 ...

  9. 用HackRF和Gqrx来听FM广播

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...

  10. [转]An overview of Openvswitch implementation

    This is NOT a tutorial on how to use openvswitch, this is for developers who want to know the implem ...