ABC162 E - Sum of gcd of Tuples (Hard)

E - Sum of gcd of Tuples (Hard)

题意

∑ a 1 = 1 K ∑ a 2 = 1 K . . . ∑ a N = 1 K g c d ( a 1 , a 2 , . . . , a N )   ( m o d 1 e 9 + 7 ) \sum_{a_{1}=1}^{K} \sum_{a_{2}=1}^{K}...\sum_{a_{N}=1}^{K} gcd(a_{1},a_{2},...,a_{N}) ~(mod 1e9+7) a1=1Ka2=1K...aN=1Kgcd(a1,a2,...,aN) (mod1e9+7)

思路

  1. 莫比乌斯反演(不会可以参考zdragon
  2. 简单容斥

这里讲一下简单容斥的做法吧因为笔者目前还不会莫比乌斯反演
f [ i ] f[i] f[i]为以 i i i g c d gcd gcd的个数,枚举 i i i f [ i ] = ⌊ k i ⌋ n − f [ i ∗ 2 ] − f [ i ∗ 3 ] . . . − f [ ( i ∗ t ) ( < = n ) ] f[i]=\lfloor\frac{k}{i}\rfloor^n-f[i*2]-f[i*3]...-f[(i*t)(<=n)] f[i]=iknf[i2]f[i3]...f[(it)(<=n)]
f [ i ] = ⌊ K i ⌋ N − ∑ j > i , i ∣ j f [ j ] f[i]={\lfloor \frac{K}{i}\rfloor}^{N}-\sum_{j>i,i|j}f[j] f[i]=iKNj>i,ijf[j]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 1e5 + 5;

long long n,k,f[N];

ll power(ll a,ll b){return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k;
	ll ans=0;
	for(int i=k;i>=1;i--){
		f[i]=power(k/i,n);
		for(int j=2*i;j<=k;j+=i) f[i]-=f[j];
		ans=(ans+i*f[i]%mod)%mod;//大小×个数才是该数所有的和
	}
	cout<<(ans+mod)%mod<<'\n';
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个警告信息,意思是从不规则嵌套序列(即长度或形状不同的列表、元组或ndarray的列表或元组)创建ndarray已经被弃用。如果你确实想这样做,你必须在创建ndarray时指定'dtype=object'。 ### 回答2: 首先,这个警告信息是出现在Python编程语言的NumPy库中。它意味着我们正在尝试从不规则的嵌套序列(一个列表或元组的列表或元组或具有不同长度或形状的ndarray)创建一个numpy数组(也就是一个多维数组)。 这种用法是被弃用(deprecated)的,这意味着它不被推荐使用,并且在未来版本的NumPy中可能会被删除。这是因为这种用法很可能会导致不一致的结果,而且也会增加代码维护的复杂度。 因此,如果我们确实需要从一个不规则的嵌套序列创建numpy数组,我们应该明确指定‘dtype=object’。这个参数告诉NumPy去创建一个对象类型的数组(即,一个通用的、可以容纳任何类型的数组),可以容纳不同长度和形状的子数组。 总之,这个警告信息告诉我们不要使用不规则的嵌套序列来创建numpy数组,并且如果我们确实需要使用它,就要使用‘dtype=object’来明确指定数组类型。对于Python开发者来说,避免使用不被推荐的用法,是编写高质量代码的一个重要方面。 ### 回答3: 这个警告信息的意思是在创建一个ndarray数组的过程中,输入了不同长度或形状的列表、元组或ndarray,这样的创建方式已经不推荐使用了。如果确实需要这样创建,就需要在创建数组时加上一个参数'dtype=object'。 在numpy中,ndarray数组是一种多维数组对象,由相同类型的元素组成。例如,一个二维数组可以看作是一个矩阵,每个元素都是同一种类型的,比如整数或浮点数。 在创建一个ndarray数组时,可以直接传入一个列表或元组作为数组的元素,并且这些元素的长度和形状应该是一致的。例如: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 这样创建的数组a的形状为(3, 3),元素为1到9的整数。 但是,如果输入的列表或元组的长度和形状不一致,numpy就会出现警告信息。例如: b = np.array([[1, 2, 3], [4, 5], [6]]) 这样创建的数组b的形状为(3,),其中每个元素都是一个长度不一致的列表。 由于numpy默认会尝试将输入数据转换为同一种类型的元素,因此在创建不同长度或形状的列表时,numpy会采用逐个元素的方式将列表转换为ndarray,这就会导致元素的类型不一致,从而产生警告信息。 如果确实需要创建这种不同类型的ndarray数组,就需要在创建数组时加上一个参数'dtype=object',表示数组中的元素类型是对象(object)类型,可以接受任意类型的元素。例如: c = np.array([[1, 2, 3], [4, 5], [6]], dtype=object) 这样创建的数组c的形状同样为(3,),但是每个元素都是一个长度不一致的列表,类型都是object。 总之,这个警告信息提醒我们在创建ndarray数组时遵循规范,尽量避免输入不同长度或形状的列表,以免出现错误结果。如果确实需要这样的数组,就需要在创建时加上'dtype=object'参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值