A题:巴什博弈
J题:算贡献值,解决很多很多个区间的问题
题意:求for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) sum += f[i][j]; f[i][j]表示在序列从 i 位乘到第 j 位所形成的新的数的 不同质因子的个数.
分析:算贡献值,解决很多很多个区间的问题
#include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; const int maxn = 1e6+5; int a[maxn]; int pos[maxn]; int pri[maxn]; int cnt; void getpri(int x){ cnt=0; for(int i=2; i*i<=x; i++){ if(x%i==0){ pri[++cnt] = i; while(x%i==0){ x/=i; } } } if(x>1) pri[++cnt] = x; } int main(){ int n; long long ans=0; scanf("%d",&n); for(int i=1; i<=n; i++){ scanf("%d",a+i); } for(int i=1; i<=n; i++){ getpri(a[i]); for(int j=1; j<=cnt; j++){ int k=pos[ pri[j] ]; pos[ pri[j] ] = i; ans += (long long)(i-k)*(n-i+1); } } printf("%lld ", ans); }