2018nanjing onsite J Prime Game(计数题)

mac2022-06-30  21

题目链接:https://nanti.jisuanke.com/t/A2147

Given a sequence of nnn integers aia_iai​.

Let mul(l,r)=∏i=lrai\text{mul}(l, r) = \prod_{i = l}^{r} a_imul(l,r)=∏i=lr​ai​ and fac(l,r)\text{fac}(l, r) fac(l,r) be the number of distinct prime factors of mul(l,r)\text{mul}(l, r)mul(l,r).

Please calculate ∑i=1n∑j=infac(i,j)\sum_{i = 1}^{n}\sum_{j = i}^{n}\text{fac}(i, j)∑i=1n​∑j=in​fac(i,j) Input

The first line contains one integer nnn (1≤n≤1061 \le n \le 10^61≤n≤106) —\text{—}— the length of the sequence.

The second line contains nnn integers aia_iai​ (1≤i≤n,1≤ai≤1061 \le i \le n, 1 \le a_i \le 10^61≤i≤n,1≤ai​≤106) —\text{—}— the sequence. Output

Print the answer to the equation. 样例输入1

10 99 62 10 47 53 9 83 33 15 24

样例输出1

248

样例输入2

10 6 7 5 5 4 9 9 1 8 12

样例输出2

134


题目大意:任意一个区间的所有数的乘积有多少个不同的素因子,最后计算所有区间的个数的总和;

分析:

/// · /// 参考思路:https://blog.csdn.net/ftx456789/article/details/83116668 这题是计算贡献值, 先筛出每个数的素因子,同时计算每个素因子对后面的数的贡献值,若前面出现过,则从上一个位置开始计算,否则从最左边开始计算

讲下注意点吧 两个int 相乘的时候要long long ~·~

代码:

#include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e6+5; int prime[N]; unordered_map<int,int> mp; void get_prime() { for(int i=2;i<N;i++) { if(!prime[i]) { prime[++prime[0]]=i; } for(int j=1;j<=prime[j]&&i*prime[j]<N;j++) { prime[i*prime[j]]=1; if(i%prime[j]==0) { break; } } } } int a[N]; int n; ll ans=0; void get_ap(int n,int nn,int id) { for(int i=1;i<=prime[0]&&prime[i]*prime[i]<=n;i++) { if(n%prime[i]==0) { while(n%prime[i]==0) n/=prime[i]; if(mp.count(prime[i])) { ans=ans+ (ll)(id-mp[prime[i]])*(nn-id); mp[prime[i]]=id; } else { mp[prime[i]]=id; ans=ans+ (ll)(id+1)*(nn-id); } } } if(n>1) { if(mp.count(n)) { ans=ans+ (ll)(id-mp[n])*(nn-id); mp[n]=id; } else { mp[n]=id; ans=ans+ (ll)(id+1)*(nn-id); } } return ; } int main() { get_prime(); while(~scanf("%d",&n)){ ans=0; mp.clear(); for(int i=0;i<n;i++) { scanf("%d",&a[i]); get_ap(a[i],n,i); } printf("%lld\n",ans); } return 0; }
最新回复(0)