zoukankan      html  css  js  c++  java
  • Prime Game --- Gym

    题目

      https://vjudge.net/problem/Gym-101981J

    题意

      定义:mul (l, r) = (∏_{i=l}^r) (a_i)

         fac (l, r) 为 mul (l, r) 的所有不同的质因子的个数

      求 (∑_{i = 1}^n)(∑_{j = i}^n)fac (i, j)

    题解

      根据题目要求可以列出要求的内容

      (a_1)

      (a_1)*(a_2)      (a_2)

      (a_1)*(a_2)*(a_3)    (a_2)*(a_3)  (a_3)

      ……        ……      ……

      (a_1)*(a_2)*……*(a_n)  (a_2)*(a_3)*……*(a_n)    (a_n)

      要求的也就是上面这些个数的不同质因子个数之和,观察一下可以发现第 1 行到第 2 行就是将 2 项 (a_2) 加入结果,而对于答案的影响也就是新加入的 (a_2) 的质因子,由此可知第 i 行到第 i + 1 行对于答案的影响就是 (a_i) 的质因子 * i。那么我们记录下每个质因子最后是在第几层加入的,那么就知道原数中已经有几个数包含了这个质因子,那么新加入的质因子对于答案的贡献也就是 i - 该质因子之前的层数。

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define met(a, b) memset(a, b, sizeof(a))
     5 #define rep(i, a, b) for(int i = a; i <= b; i++)
     6 #define bep(i, a, b) for(int i = a; i >= b; i--)
     7 #define lowbit(x) (x&(-x))
     8 #define MID (l + r) / 2
     9 #define ls pos*2
    10 #define rs pos*2+1
    11 #define pb push_back
    12 #define ios() ios::sync_with_stdio(0)
    13 
    14 using namespace std;
    15 
    16 const int maxn = 1e6 + 1010;
    17 const int inf = 0x3f3f3f3f;
    18 const ll INF = 0x3f3f3f3f3f3f3f3f;
    19 const ll mod = 123456789;
    20 
    21 bitset<maxn> is_prime;
    22 int prime[maxn], prime_cnt;
    23 ll vis[maxn];
    24 ll res, now;
    25 
    26 void get_prime(int n) {
    27     is_prime[1] = 1;
    28     rep(i, 2, n) {
    29         if(!is_prime[i]) prime[++prime_cnt] = i;
    30         for(int j = 1; j <= prime_cnt && i * prime[j] <= n; j++) {
    31             is_prime[i * prime[j]] = 1;
    32             if(i % prime[j] == 0) break;
    33         }
    34     }
    35 }
    36 ll calc(ll n, ll x) {
    37     ll sum = 0;
    38     for(int i = 1; i <= prime_cnt && is_prime[n] && prime[i] <= n; i++) {
    39         while(n % prime[i] == 0) {
    40             sum += x - vis[prime[i]];
    41             vis[prime[i]] = x;
    42             n /= prime[i];
    43         }
    44     }
    45     if(!is_prime[n]) {
    46         sum += x - vis[n];
    47         vis[n] = x;
    48     }
    49     return sum;
    50 }
    51 
    52 int main() {
    53     ios();
    54     get_prime(maxn - 1);
    55     int n;
    56     cin >> n;
    57     rep(i, 1, n) {
    58         ll a;
    59         cin >> a;
    60         now += calc(a, i);
    61         res += now;
    62     }
    63     cout << res << endl;
    64     return 0;
    65 }
  • 相关阅读:
    awk 字符串函数
    C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
    Redis 命令总结
    个人网站和博客赚钱之路(转)
    二叉树的前序、中序、后序遍历与创建
    16个值得个人站长做的广告联盟[转自cnzz]
    mysql 添加[取消]timestamp的自动更新
    转:函数式编程初探
    可爱的 Python : Python中的函数式编程,第三部分
    可爱的 Python : Python中函数式编程,第二部分
  • 原文地址:https://www.cnblogs.com/Ruby-Z/p/12189432.html
Copyright © 2011-2022 走看看