洛谷 P1593 因子和 题解
2024-09-05 16:11:21
这道题在数学方面没什么难度:
对于每一个正整数n:
质因数分解后可以写成n=a1^k1a2^k2……*ai^ki
所求的数的因数和f(n)就等于f(n)=(1+a1+a1^2+……+a1^k1)(1+a2+a2^2+……+a2^k2)……*(1+ai+ai^2+……+ai^ki)
利用等比数列通项公式可以O(1)的时间算出每一项;
然后可以使用扩展欧几里得,费马小定理或求解逆元。
但,仅仅是这样吗?
注意,模数p是9901,十分的小,但是要求逆元的数完全可能是9901的倍数,从而与9901不互质,从而没有逆元
例如:950497 1 ans=2;
在处理完以上的特殊情况后我们可以十分生气的一边骂出题人一边AC掉它;
#include <bits/stdc++.h>
#define int long long
#define p 9901
using namespace std;
long long KSM(long long a,long long b)
{
long long res=;
while(b){
if(b&) res=res*a%p;
a=a*a%p;
b/=;
}
return res;
}
long long yinzi[],cnt,num[];
void fenjie(int a)
{
for(int i=;i<=sqrt(a);i++){
if(a%i==){
yinzi[++cnt]=i;
while(a%i==){
++num[cnt];
a/=i;
}
}
}
if(a>=){
yinzi[++cnt]=a;
num[cnt]=;
}
}
signed main()
{
int a,b;
cin>>a>>b;
fenjie(a);
for(int i=;i<=cnt;i++){
num[i]=num[i]*b;
}
long long ans=;
for(int i=;i<=cnt;i++){
ans=(ans*(-KSM(yinzi[i],num[i]+))%p*KSM((-yinzi[i]),p-))%p;
}
if(ans==){
cout<<""<<endl;
return ;
}
cout<<ans;
}
最新文章
- ubuntu下更改鼠标移动速度
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表
- SQL基础--完整性约束
- AndroidStudio .gitinore编写
- kinect for windows sdk
- #JavaScript对象与继承
- QLabel设置行间距(使用html的语法,比较巧妙)
- Spark MLlib KMeans 聚类算法
- SQL插入数据--数据中的某一列来自本表中的数据
- windows上python的安装
- CentOS 7下PXE+Kickstart无人值守安装操作系统
- SpringBoot几个重要的事件回调、监听机制
- Confluence 6 空间标识
- Spring.net介绍及MVC中应用
- ajax 把返回结果作为参数传递
- java中集合格式及json格式的特点和转换
- windows的共享内存
- 【mysql】备份篇1:使用系统计划任务+mysqldump 定时备份mysql数据库 不用输入密码自动导出sql文件
- Java_io__BIO_NIO_AIO
- MarkDown 语言简单使用
热门文章
- C# IIS域名绑定
- PHP大文件上传断点续传源码
- Visual Stdio C++ 编译器、链接器常用命令
- FFT用于高效大数乘法(当模板用)
- C++常用string函数
- pycharm中调用函数方法自动补全p,m,c,v,f分别是什么意思
- 学习笔记:python3,代码。小例子习作
- 「TJOI2019」唱、跳、rap 和篮球
- [JZOJ6400]:Game(贪心+线段树+二分)
- python环境下安装virtualenv,virtualenvwrapper