• 牛客多校(2020第四场)B Basic Gcd Problem(质因数分解)


    题目链接:https://ac.nowcoder.com/acm/contest/5669/B

    题意:

    那本题只要求出n的质因子个数即可

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<stdlib.h>
     6 #include<vector>
     7 using namespace std;
     8 
     9 #define ll long long
    10 const int N = 1e6 + 5;
    11 const ll MOD = 1e9 +7;
    12 
    13 int c,n;
    14 
    15 int main() {
    16     ios::sync_with_stdio(false);
    17     cin.tie(0);
    18 
    19     int t;
    20     cin>>t;
    21     
    22     while(t--) {
    23         scanf("%d %d",&n,&c);
    24         ll cnt = 1;
    25         
    26         for (int i = 2; i * i <= n; i++) {
    27             while (n % i == 0) {
    28                 cnt = cnt * c % MOD;
    29                 n /= i;
    30             }
    31         }
    32         if(n!=1) cnt = cnt * c % MOD;
    33         cout << cnt << "
    ";
    34     } 
    35     return 0;
    36 }

     解法2:先将1~N的质因子个数存储起来再使用

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<stdlib.h>
     6 #include<vector>
     7 using namespace std;
     8 const int N = 1e6 + 5;
     9 const int MOD = 1e9 +7;
    10 
    11 long long c,n;
    12 long long v[N], prime[N], temps[N];
    13 
    14 void primes(int n)  {
    15     memset(v, 0, sizeof(v));
    16     memset(prime, 0, sizeof(prime));
    17     fill(temps, temps+N, 1); //存储质因数个数
    18 
    19     int m = 0; //质数数量
    20     for (int i = 2; i <= n; i++) {
    21         if (v[i] == 0)  {v[i] = i; prime[++m] = i;}
    22 
    23         for (int j = 1; j <= m; j++) {
    24             if(prime[j] > v[i] || prime[j] > n / i) break; //要赋给i * prime[j]的最小质因子为prime[j],如果prime[j]比i的最小质因子都大,那肯定得退出循环了
    25             v[i*prime[j]] = prime[j];
    26             temps[i*prime[j]] = temps[prime[j]] + temps[i]; //递推该质因数的个数
    27         }
    28     }
    29 }
    30 
    31 long long fun(long long x,long long n) {
    32     long long res = 1;
    33     while (n > 0) {
    34         if (n & 1)  res = res * x % MOD;
    35         x = x * x % MOD;
    36         n >>= 1;
    37     }
    38     return res;
    39 }
    40 
    41 int main() {
    42     int t;
    43     cin>>t;
    44     primes(N);    
    45     while(t--) {
    46         scanf("%lld %lld",&n,&c);
    47         if (n == 1)
    48             cout << "1
    ";
    49         else
    50             cout<<fun(c,temps[n]) % MOD<<"
    ";
    51     } 
    52     return 0;
    53 }
  • 相关阅读:
    Photoshop教程,视频MP4格式转换为GIF格式
    pyqgis环境配置
    R 输出函数 格式化输出 打印函数
    linux ubuntu 更改终端的默认设置,终端大小,字体
    wps 显示所有的字符,将参考文献排序,插入目录
    在 word 中 怎么让表格旋转方向
    linux argc argv
    linux 命令行的快捷键 vim
    linux 操作系统,以及一般的操作系统 所看书籍
    win 10 快速启动 某些程序
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/13524986.html
Copyright © 2020-2023  润新知