求 \(n^k\) 的因子和, \(n \leq 2^{16}, k \leq 20\)

Solution

\[\prod_i \frac{p_i^{q_ik+1}-1}{p_i-1}
\]

#include <bits/stdc++.h>
using namespace std; const int maxlen = 105; class HP {
public:
int len, s[maxlen];
HP() { (*this) = 0; }
HP(int inte) { (*this) = inte; }
HP(const char *str) { (*this) = str; }
friend ostream &operator<<(ostream &cout, const HP &x);
HP operator=(int inte);
HP operator=(const char *str);
HP operator=(const HP &b);
HP operator*(const HP &b);
HP operator+(const HP &b);
HP operator-(const HP &b);
HP operator/(const HP &b);
HP operator%(const HP &b);
bool operator<(const HP &b);
bool operator>(const HP &b);
int Compare(const HP &b);
}; ostream &operator<<(ostream &cout, const HP &x) {
for (int i = x.len; i >= 1; i--) cout << x.s[i];
return cout;
}
HP HP::operator=(const char *str) {
len = (int)strlen(str);
for (int i = 1; i <= len; i++) s[i] = str[len - i] - '0';
return *this;
}
HP HP::operator=(int inte) {
if (inte == 0) {
len = 1;
s[1] = 0;
return (*this);
}
for (len = 0; inte > 0;) {
s[++len] = inte % 10;
inte /= 10;
}
return *this;
}
HP HP::operator=(const HP &b) {
len = b.len;
for (int i = 1; i <= len; i++) s[i] = b.s[i];
return *this;
}
HP HP::operator*(const HP &b) {
int i, j;
HP c;
c.len = len + b.len;
for (i = 1; i <= c.len; i++) c.s[i] = 0;
for (i = 1; i <= len; i++)
for (j = 1; j <= b.len; j++) c.s[i + j - 1] += s[i] * b.s[j];
for (i = 1; i < c.len; i++) {
c.s[i + 1] += c.s[i] / 10;
c.s[i] %= 10;
}
while (c.s[i]) {
c.s[i + 1] = c.s[i] / 10;
c.s[i] %= 10;
i++;
}
while (i > 1 && !c.s[i]) i--;
c.len = i;
return c;
}
HP HP::operator+(const HP &b) {
int i;
HP c;
c.s[1] = 0;
for (i = 1; i <= len || i <= b.len || c.s[i]; i++) {
if (i <= len)
c.s[i] += s[i];
if (i <= b.len)
c.s[i] += b.s[i];
c.s[i + 1] = c.s[i] / 10;
c.s[i] %= 10;
}
c.len = i - 1;
if (c.len == 0)
c.len = 1;
return c;
}
HP HP::operator-(const HP &b) {
int i, j;
HP c;
for (i = 1, j = 0; i <= len; i++) {
c.s[i] = s[i] - j;
if (i <= b.len)
c.s[i] -= b.s[i];
if (c.s[i] < 0) {
j = 1;
c.s[i] += 10;
} else
j = 0;
}
c.len = len;
while (c.len > 1 && !c.s[c.len]) c.len--;
return c;
}
int HP::Compare(const HP &y) {
if (len > y.len)
return 1;
if (len < y.len)
return -1;
int i = len;
while ((i > 1) && (s[i] == y.s[i])) i--;
return s[i] - y.s[i];
}
bool HP::operator<(const HP &b) {
if (len < b.len)
return 1;
if (len > b.len)
return 0;
int i = len;
while ((i > 1) && (s[i] == b.s[i])) i--;
return s[i] < b.s[i];
}
bool HP::operator>(const HP &b) {
if (len > b.len)
return 1;
if (len < b.len)
return 0;
int i = len;
while ((i > 1) && (s[i] == b.s[i])) i--;
return s[i] > b.s[i];
}
HP HP::operator/(const HP &b) {
int i, j;
HP d(0), c;
for (i = len; i > 0; i--) {
if (!(d.len == 1 && d.s[1] == 0)) {
for (j = d.len; j > 0; j--) d.s[j + 1] = d.s[j];
++d.len;
}
d.s[1] = s[i];
c.s[i] = 0;
while ((j = d.Compare(b)) >= 0) {
d = d - b;
c.s[i]++;
if (j == 0)
break;
}
}
c.len = len;
while ((c.len > 1) && (c.s[c.len] == 0)) c.len--;
return c;
}
HP HP::operator%(const HP &b) {
int i, j;
HP d(0);
for (i = len; i > 0; i--) {
if (!(d.len == 1 && d.s[1] == 0)) {
for (j = d.len; j > 0; j--) d.s[j + 1] = d.s[j];
++d.len;
}
d.s[1] = s[i];
while ((j = d.Compare(b)) >= 0) {
d = d - b;
if (j == 0)
break;
}
}
return d;
} int n,k,a[99],b[99],top;
HP ans;
int main() {
cin>>n>>k;
ans=1;
int t=n;
for(int i=2;i<=n;i++) {
if(t%i==0) {
a[++top]=i;
}
while(t%i==0) {
b[top]++;
t/=i;
}
}
for(int i=1;i<=top;i++) {
HP tmp=1,xx;
for(int j=1;j<=b[i]*k+1;j++) xx=a[i],tmp=tmp*xx;
xx=1;
tmp=tmp-xx;
xx=a[i]-1;
tmp=tmp/xx;
ans=ans*tmp;
}
cout<<ans;
}

[AHOI2002] 芝麻开门 - 数论的更多相关文章

  1. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  2. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

  3. NOIP2014 uoj20解方程 数论(同余)

    又是数论题 Q&A Q:你TM做数论上瘾了吗 A:没办法我数论太差了,得多练(shui)啊 题意 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, ...

  4. 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)

    ~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...

  5. hdu 1299 Diophantus of Alexandria (数论)

    Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  6. 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

    4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status ...

  7. bzoj2219: 数论之神

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. hdu5072 Coprime (2014鞍山区域赛C题)(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出N个数,求有多少个三元组,满足三个数全部两两互质或全部两两不互质. 题解: http://dty ...

  9. ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德

    POJ 1061 青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu  Descr ...

随机推荐

  1. 如何避免FOUC,是如何产生的

    FOUC(Flash Of Unstyled Content)即浏览器样式闪烁或者叫做无样式内存闪烁(用户定义样式表加载之前浏览器使用默认样式显示文档,用户样式加载渲染之后再从新显示文档,造成页面闪烁 ...

  2. Sap Hana 关于BP的一些理解

    BP里面有角色和角色分组,角色分组相当于包含多个角色. 客户和供应商使用不同的角色来创建. 创建角色和分组前可以创建自定义的角色类别和角色分组类别. 文档:关于BP.note 链接:笔记 作者:明光烁 ...

  3. 教你用python爬虫监控教务系统,查成绩快人一步!

    教你用python爬虫监控教务系统,查成绩快人一步!这几天考了大大小小几门课,教务系统又没有成绩通知功能,为了急切想知道自己挂了多少门,于是我写下这个脚本. 设计思路:设计思路很简单,首先对已有的成绩 ...

  4. JS DOM用不同方法获取节点及对节点插入、复制和移除

    操作节点的方法 appendChild() insertBefore() replaceChild() cloneNode() normalize() splitText() sppendChild( ...

  5. MySQL基础(2) | 数据库、数据表

    MySQL基础(2) | 数据库.数据表 基本语法 数据库 #创建 CREATE DATABASE IF NOT EXISTS test_db_char DEFAULT CHARACTER SET u ...

  6. springboot 查看H2数据库

    1  再application.properties文件中,添加 spring.h2.console.enabled=true 2 再浏览器中打开: http://localhost:8080/h2- ...

  7. Android 调试桥 (adb) 是 命令行命令--官方拷贝过来的,留作自己查看

    Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令 ...

  8. spring mvc5 的 配置文件 pom.xml

    spring mvc5 的 配置文件  pom.xml <?xml version="1.0" encoding="UTF-8"?> <pro ...

  9. BUGFIX 09 - 记一次Java中String的split正则表达式匹配 - 引发`OutOfMemoryError: Java heap space`的oom异常 排查及解决 -Java根据指定分隔符分割字符串,忽略在引号里面的分隔符

    问题简述 说白了,Java根据指定分隔符分割字符串,忽略在引号(单引号和双引号)里面的分隔符; oom压测的时候,正则匹配"(?=(?:[^\"]*\"[^\" ...

  10. 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)

    qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...