【SSOJ 2913: 「一本通 6.4 例 3」Sumdiv】题解
题目
原题来自:Romania OI 2002
求 的所有约数之和 。
思路
首先按照算术基本定理:
所以:
然后根据约数和公式:
然后根据等比数列求和公式:
然后就解出来了。
总结
这是一道非常综合的题,考察知识点主要有四个:
- 算术基本定理(质因数分解)
- 约数和公式
- 等比数列求和公式
- 求逆元(费马小定理+快速幂)
每一个知识点都尤为重要,只要懂得这些知识点,这道题就迎刃而解了。
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
//#define N
//#define M
#define mo 9901
int n, m=1, i, j, k;
int a, b;
int kuai(int a, int b)
{
int ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mo;
a=(a*a)%mo;
b>>=1;
}
return ans;
}
int deng(int x, int n)
{
return (kuai(x, n+1)-1)*kuai(x-1, mo-2)%mo;
}
signed main()
{
// freopen("tiaoshi.in","r",stdin);
// freopen("tiaoshi.out","w",stdout);
a=read(); b=read();
for(i=2; i<=a; ++i)
if(a%i==0)
{
k=0; while(a%i==0) ++k, a/=i;
// printf("deng(%lld, %lld)=%lld\n", i, k*b, deng(i, k*b));
m*=deng(i, k*b);
m%=mo;
}
printf("%lld", (m%mo+mo)%mo);
return 0;
}
本文来自博客园,作者:zhangtingxi,转载请注明原文链接:https://www.cnblogs.com/zhangtingxi/p/15817137.html
分类:
数学
, 数学-数论-逆元
, 数学-数论-质数筛
, 数学-数论-线性筛
, 数学-数论-质数
, 数学-组合-快速幂
, 数学-数论
, OJ-SSOJ
, 数学-数论-欧几里得定理/gcd
, 数学-数论-拓展欧几里得定理/exgcd
, 数学-数论-算术基本定理
, 数学-数论-等比数列
, 数学-数论-约数和
, 数学-数论-费马小定理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!