经典算法 约数之和

打印 上一主题 下一主题

主题 1821|帖子 1821|积分 5465

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原题目链接
问题描述

假设现在有两个自然数 A 和 B,设 S 为 A^B 的所有约数之和
请你盘算:S mod 9901 的值。

输入格式

在一行中输入两个用空格隔开的整数 A 和 B。

输出格式

输出一个整数,表现 S mod 9901 的值。

数据范围



  • 0 ≤ A, B ≤ 5 × 10^7
  • A 和 B 不会同时为 0

输入样例

  1. 2 3
复制代码

输出样例

  1. 15
复制代码
c++代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll A, B;
  5. //求a^b对p取模
  6. ll mypow(ll a, ll b, ll p) {
  7.     if (b == 0) return 1 % p;
  8.     if (b == 1) return a % p;
  9.     __int128_t k = mypow(a, b / 2, p);
  10.     if (b % 2 == 0) return (k * k) % p;
  11.     else return (k * k * a) % p;
  12. }
  13. //求p^0 + p^1 + p^2 + p^3 + ... + p^k
  14. ll sum_of_a_geometric_series(ll p, ll k) {
  15.     if (k == 0) return 1;
  16.     if (k == 1) return 1 + p;
  17.     if (k % 2 == 0) {
  18.         ll a = mypow(p, k, 9901);
  19.         ll b = a + sum_of_a_geometric_series(p, k - 1);
  20.         return b % 9901;
  21.     }
  22.     else {
  23.         ll a = mypow(p, k / 2 + 1, 9901) + 1;
  24.         ll b = a * sum_of_a_geometric_series(p, k / 2);
  25.         return b % 9901;
  26.     }
  27. }
  28. ll prime_factorization() {
  29.     if (A == 0) return 0;
  30.     if (A == 1 || B == 0) return 1;
  31.     ll ans = 1;
  32.     for (int i = 2; i <= A; i++) {
  33.         ll cont = 0;
  34.         while(A % i == 0) A /= i, cont++;
  35.         if (cont == 0) continue;
  36.         cont *= B;
  37.         ans *= sum_of_a_geometric_series(i, cont);
  38.         ans %= 9901;
  39.     }
  40.     return ans;
  41. }
  42. int main() {
  43.     cin >> A >> B;
  44.     cout << prime_factorization();
  45.     return 0;
  46. }//by wqs
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表