于神之怒

题目大意

ni=1mj=1gcd(i,j)k
n,m,k<=5000000

繁衍

h[i]=ik ,显然h可以线筛出来。
设n<=m如果不小于就调换。
f[d]=ni=1mj=1(gcd(i,j)==d)
那么显然 f[d]=ndi=1mdj=1(gcd(i,j)==1)
这意味着我们进行分块,每一块的f值都相同。
ans=nd=1f[d]h[d]
容易想到求f使用莫比乌斯反演,于是
f[d]=ndi=1ndimdiμ[i]
那么同样进行分块,每一块的 ndimdi 一样。
所以线筛出h与 μ 即可。

参考程序

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const ll mo=1000000007;
ll mu[5000000+10],pri[1000000],h[5000000+10],sum[5000000+10],num[5000000+10];
bool bz[5000000+10];
ll i,j,k,l,r,t,n,m,nn,mm,p,top,tot,ans;
ll quicksortmi(ll x,ll y){
    if (!y) return 1;
    ll t=quicksortmi(x,y/2);
    t=t*t%mo;
    if (y%2) t=t*(x%mo)%mo;
    return t;
}
ll min(ll a,ll b){
    if (a<b) return a;else return b;
}
int main(){
    //freopen("D:/wa.txt","w",stdout);
    scanf("%lld%lld%lld",&n,&m,&p);
    if (n>m) swap(n,m);
    top=0;
    mu[1]=h[1]=1;
    fo(i,2,n){
        if (!bz[i]){
            pri[++top]=i;
            mu[i]=-1;
            h[i]=quicksortmi(i,p);
        }
        fo(j,1,top){
            if (i*pri[j]>n) break;
            h[i*pri[j]]=1LL*h[i]*h[pri[j]]%mo;
            bz[i*pri[j]]=1;
            if (i%pri[j]==0) break;
            mu[i*pri[j]]=-mu[i];
        }
    }
    sum[0]=num[0]=0;
    fo(i,1,n) num[i]=num[i-1]+mu[i],sum[i]=(sum[i-1]+h[i])%mo;
    i=1;
    while (i<=n){
        j=min(n/(n/i),m/(m/i));
        nn=n/i,mm=m/i;
        k=1;r=0;
        while (k<=nn){
            l=min(nn/(nn/k),mm/(mm/k));
            r=((nn/k)*(mm/k)%mo*(num[l]-num[k-1])%mo+r)%mo;
            k=l+1;
        }
        t=(sum[j]-sum[i-1])%mo;
        r=r*t%mo;
        ans=(ans+r)%mo;
        i=j+1;
    }
    printf("%lld\n",ans);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark SQL是Apache Spark中的一个模块,它提供了一种用于处理结构化数据的统一接口。Spark SQL支持使用SQL查询和DataFrame API进行数据处理和分析。它可以读取多种数据源,包括Hive、HDFS、关系型数据库等,并将它们转换为分布式的数据集。 Spark SQL的主要特点包括: . 支持SQL查询:Spark SQL允许用户使用标准的SQL语句来查询和分析数据。它支持大部分的SQL语法和函数,可以进行复杂的数据处理操作。 2. DataFrame API:除了SQL查询,Spark SQL还提供了DataFrame API,它是一种更加灵活和强大的数据操作接口。DataFrame是一种分布式的数据集,类似于关系型数据库中的表,可以进行类似于SQL的操作,如过滤、聚合、排序等。 3. 支持多种数据源:Spark SQL可以读取和写入多种数据源,包括Hive、HDFS、关系型数据库、Parquet、Avro等。它可以将不同数据源的数据统一处理,并提供一致的接口。 4. 集成Hive:Spark SQL可以与Hive集成,可以直接读取Hive中的数据,并使用Hive的元数据。这使得在Spark中使用Hive的数据变得更加方便。 5. 性能优化:Spark SQL使用了多种性能优化技术,如基于Catalyst优化器的查询优化、列式存储、数据压缩等,可以提高查询和数据处理的性能。 下面是一个使用Spark SQL进行数据处理的示例: ```python from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder \ .appName("SparkSQLExample") \ .getOrCreate() # 读取数据 df = spark.read.format("csv").option("header", "true").load("data.csv") # 执行SQL查询 df.createOrReplaceTempView("data") result = spark.sql("SELECT * FROM data WHERE age > 30") # 显示结果 result.show() # 关闭SparkSession spark.stop() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值