- https://nanti.jisuanke.com/?kw=ACM-ICPC%202018%20%E5%8D%97%E4%BA%AC%E8%B5%9B%E5%8C%BA%E7%BD%91%E7%BB%9C%E9%A2%84%E8%B5%9B
- 利用线性筛除平方数的倍数就是把素数筛的第二层for
- j + = i 变为 j + = i×i .
- 然后看一下因数的贡献度
- 举例 当 n = 8时 1的 贡献度 有 1*1 (1*2 ,1*3, 1*5,1*6,1*7 ) 后面这一部分要*2 1+5*2=11
- 2的贡献度 有 2*2 (2*3) (因为2*1可以在之前算到,所以我们再后面计算的时候只从比当前的数大的对数)1+1*2=3
- 》=3 就没有贡献
- 所以总的贡献就是3+11=14
- 总的来说,我们只要算出到n为止有多少个满足条件的a,b,那么对于每一个非平方数倍数因子i ,他的贡献度就是 (cnt[n/i]-cnt[i])*2+1
-
#include <bits/stdc++.h> #define maxn 20000007 using namespace std; bool isprime[maxn]; int sum[maxn],t,n,ans; void prime() { memset(isprime,0,sizeof(isprime)); isprime[1]=0; for(int i=2; i<=sqrt(maxn); i++) for(int j=i*i; j<=maxn; j+=i*i) isprime[j]=1; for(int i=1; i<=maxn; i++) if(!isprime[i]) sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]; } int main() { prime(); cin>>t; while(t--) { ans=0; cin>>n; for(int i=1; i*i<=n; i++) if(!isprime[i]) ans+=(sum[n/i]-sum[i])*2+1; cout<<ans<<endl; } return 0; }
Sum-square-free贡献度
最新推荐文章于 2023-05-05 11:09:19 发布