• 牛客多校(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 }
  • 相关阅读:
    PowerDesigner中生成SQL SERVER2005字段注释 和导出图片的方法
    右键显示打开控制台
    dubbo 的 Protocol 类
    nacos 的 grpc
    shell 替换文本中 为空格,多行为本合并为一行
    gcc、python3、python性能分析工具安装
    kafka listeners和advertised
    Default Activity not found 问题解决
    使用Global Mapper计算kml中面状图形的面积
    jeecg-boot 报表组——折线图初始化显示部分图例,部分变灰
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/13524986.html
Copyright © 2020-2023  润新知