• E


    题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来。题解还是挺好的理解的。

    首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值。有n个数,所有就有(k/i)^n种情况。光是这样还是不行的,因为a1~an的gcd可能为j*i。所以我们要减去2*i,3*i......j*i<=k。倒着来就可以了,复杂度应该是o(nlogn)

    code:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=1e5+7;
    const ll MOD=1e9+7;
    ll dp[N];
    ll ksm(ll x,ll y){
        ll res=1;
        while(y){
            if(y&1) res=res*x%MOD;
            x=x*x%MOD;
            y>>=1;
        }
        return res%MOD;
    }
    int main(){
        ll n,k;
        cin>>n>>k;
        ll ans=0;
        for(ll i=k;i>=1;i--){
            dp[i]=ksm(k/i,n);
            for(ll j=2*i;j<=k;j+=i) dp[i]=(dp[i]-dp[j]+MOD)%MOD;
            ans=(ans+i*dp[i]+MOD)%MOD;
        }
        cout<<ans<<endl;
        return 0;
    } 
  • 相关阅读:
    [NOI2004] 郁闷的出纳员
    对象内部套嵌多个对象
    函数
    匿名函数、对象
    函数部分
    Html部分
    搜索二叉树的应用
    二叉树的线索化
    搜索结构搜索二叉树
    堆与最优级队列
  • 原文地址:https://www.cnblogs.com/Accepting/p/12696488.html
Copyright © 2020-2023  润新知