BZOJ-3529 数表(莫比乌斯反演 BIT)


BZOJ-3529 数表








#include<bits/stdc++.h>
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
#define itn int
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
#define STR clock_t startTime = clock();
#define END clock_t endTime = clock();cout << double(endTime - startTime) / CLOCKS_PER_SEC *1000<< "ms" << endl;
using namespace std;
const int N=1e5+5;
const long long mod=1e9+7;
const long long mod2=998244353;
const int oo=0x7fffffff;
const int sup=0x80000000;
typedef long long ll;
typedef unsigned long long ull;
template <typename it>void db(it *begin,it *end){while(begin!=end)cout<<(*begin++)<<" ";puts("");}
template <typename it>
string to_str(it n){string s="";while(n)s+=n%10+'0',n/=10;reverse(s.begin(),s.end());return s;}
template <typename it>int o(it a){cout<<a<<endl;return 0;}
ll mul(ll a,ll b,ll c){ll ans=0;for(;b;b>>=1,a=(a+a)%c)if(b&1)ans=(ans+a)%c;return ans;}
ll ksm(ll a,ll b,ll c){ll ans=1;for(;b;b>>=1,a=mul(a,a,c))if(b&1)ans=mul(ans,a,c);return ans;}
void exgcd(ll a,ll b,ll &x,ll &y){if(!b)x=1,y=0;else exgcd(b,a%b,y,x),y-=(a/b)*x;}
unsigned int g[N]={0},ANS[N];
ll F[N]={0};
int prime[N],tot=0;
bool vis[N];
short int mu[N];
pair<ll,int>f[N];
struct node{
    int n,m,a,id;
    bool friend operator <(node x,node y){
        return x.a<y.a;
    }
}QQ[N];
void up(int id,unsigned int x){
    for(int i=id;i<=100000;i+=i&(-i))g[i]+=x;
}
unsigned int Q(int id){
    unsigned int ans=0;
    for(int i=id;i;i&=i-1)ans+=g[i];
    return ans;
}
void pre(){
    mu[1]=1;
    for(int i=2;i<N;i++){
        if(!vis[i])prime[++tot]=i,mu[i]=-1;
        for(int j=1;j<=tot&&i*prime[j]<N;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j]==0){
                mu[i*prime[j]]=0;
                break;
            }else mu[i*prime[j]]=-mu[i];
        }
    }
    for(int i=1;i<N;i++)
    for(int j=i;j<N;j+=i)
    F[j]+=i;
    for(int i=1;i<N;i++)f[i]={F[i],i};
    sort(f+1,f+N);
}
unsigned int solve(int n,int m){
    unsigned int ans=0;
    if(n>m)swap(n,m);
    for(int i=1,last;i<=n;i=last+1){
        last=min(n/(n/i),m/(m/i));
        ans+=(unsigned int)((n/i)*(m/i)*(Q(last)-Q(i-1)));
    }
    return ans;
}
int main(){
    pre();
    int t;cin>>t;
    for(int i=1;i<=t;i++)sc("%d%d%d",&QQ[i].n,&QQ[i].m,&QQ[i].a),QQ[i].id=i;
    sort(QQ+1,QQ+1+t);
    int pos=0;
    for(int cas=1;cas<=t;cas++){
        while(pos+1<=100000&&QQ[cas].a>=f[pos+1].first){
            pos++;
            for(int i=f[pos].second;i<N;i+=f[pos].second)up(i,f[pos].first*mu[i/f[pos].second]);
        }
        ANS[QQ[cas].id]=solve(QQ[cas].n,QQ[cas].m);
    }
    for(int i=1;i<=t;i++)printf("%d\n",ANS[i]&oo);
}

全部评论

相关推荐

MingoTree:看不出你你的技术栈,想找什么工作,然后课设项目别写上去了,自我评价删了,前后端你想好你要干啥,这种简历投上去秒挂的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务