SP34096 DIVCNTK - Counting Divisors (general)(Min_25筛)

题面

洛谷

\(\sigma_0(i)\) 表示\(i\) 的约数个数

\(S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\mod 2^{64}\)

多测,\(T\le10^4,n,k\le10^{10}\)

题解

\(f(i)=\sigma_0(i^k)\)首先可以发现几个性质

\[f(1)=1\]

\[f(p)=k+1\]

\[f(p^c)=kc+1\]

\[f(ab)=f(a)f(b),\gcd(a,b)=1\]

也就是说\(f\)是个积性函数,直接上\(Min\_25\)筛就行了

然后把本题里的\(k\)改成\(2\)\(3\)就可以水过\(DIVCNT2\)\(DIVCNT3\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll unsigned long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
    R ll res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){
    if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5;
bitset<N>vis;int p[N],id1[N],id2[N],sqr,m;
ll n,k,lim,tot,w[N<<1],sp[N],g[N<<1],h[N<<1];
void init(int n){
    fp(i,2,n){
        if(!vis[i])p[++tot]=i;
        for(R int j=1;j<=tot&&1ll*i*p[j]<=n;++j){
            vis[i*p[j]]=1;
            if(i%p[j]==0)break;
        }
    }lim=tot;
}
ll S(ll x,int y){
    if(x<=1||p[y]>x)return 0;
    int id=(x<=sqr)?id1[x]:id2[n/x];
    ll res=g[id]+h[id]-(k+1)*(y-1);
    for(int i=y;i<=tot&&1ll*p[i]*p[i]<=x;++i){
        ll tmp=p[i];
        for(R int e=1;tmp*p[i]<=x;tmp*=p[i],++e){
            id=(x/tmp<=sqr)?id1[x/tmp]:id2[n/(x/tmp)];
            res+=S(x/tmp,i+1)*(k*e+1)+k*(e+1)+1;
        }
    }
    return res;
}
void solve(){
    n=read(),k=read(),sqr=sqrt(n),m=0;
    tot=upper_bound(p+1,p+1+lim,sqr)-p-1;
    for(R ll i=1,j;i<=n;i=j+1){
        j=n/(n/i),w[++m]=n/i;
        w[m]<=sqr?id1[w[m]]=m:id2[n/w[m]]=m;
        g[m]=(w[m]-1)*k;
        h[m]=(w[m]-1);
    }
    fp(j,1,tot)for(R int i=1;1ll*p[j]*p[j]<=w[i];++i){
        int id=(w[i]/p[j]<=sqr)?id1[w[i]/p[j]]:id2[n/(w[i]/p[j])];
        g[i]-=g[id]-(j-1)*k;
        h[i]-=h[id]-(j-1);
    }
    print(S(n,1)+1);
}
int main(){
//  freopen("testdata.in","r",stdin);
    init(N-5);
    int T=read();
    while(T--)solve();
    return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10417810.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
boosting-crowd-counting-via-multifaceted-attention是一种通过多方面注意力提升人群计数的方法。该方法利用了多个方面的特征来准确估计人群数量。 在传统的人群计数方法中,往往只关注人群的整体特征,而忽略了不同区域的细节。然而,不同区域之间的人群密度可能存在差异,因此细致地分析这些区域是非常重要的。 该方法首先利用卷积神经网络(CNN)提取图像的特征。然后,通过引入多个注意力机制,分别关注图像的局部细节、稀疏区域和密集区域。 首先,该方法引入了局部注意力机制,通过对图像的局部区域进行加权来捕捉人群的局部特征。这使得网络能够更好地适应不同区域的密度变化。 其次,该方法采用了稀疏区域注意力机制,它能够识别图像中的稀疏区域并将更多的注意力放在这些区域上。这是因为稀疏区域往往是需要重点关注的区域,因为它们可能包含有人群密度的极端变化。 最后,该方法还引入了密集区域注意力机制,通过提取图像中人群密集的区域,并将更多的注意力放在这些区域上来准确估计人群数量。 综上所述,boosting-crowd-counting-via-multifaceted-attention是一种通过引入多个注意力机制来提高人群计数的方法。它能够从不同方面细致地分析图像,并利用局部、稀疏和密集区域的特征来准确估计人群数量。这个方法通过考虑人群分布的细节,提供了更精确的人群计数结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值