E - Sum of gcd of Tuples (Hard)

深夜水题一发

Problem Statement

Consider sequences {A1,...,AN}{A1,...,AN} of length NN consisting of integers between 11 and KK (inclusive).

There are KNKN such sequences. Find the sum of gcd(A1,...,AN)gcd(A1,...,AN) over all of them.

Since this sum can be enormous, print the value modulo (109+7)(109+7).

Here gcd(A1,...,AN)gcd(A1,...,AN) denotes the greatest common divisor of A1,...,ANA1,...,AN.

Constraints

  • 2≤N≤10^5
  • 1≤K≤10^5
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the sum of gcd(A1,...,AN)gcd(A1,...,AN) over all KNKN sequences, modulo (109+7)(109+7).


Sample Input 1 Copy

Copy

3 2

Sample Output 1 Copy

Copy

9

题意:给你一个长度为n的序列,每一个数位的值限定于1-k之间,求每个可能的序列,其最大公因子之和。

思路:题意可以理解为求当序列最大公因子为 i (1<=i<=k) 时,可能序列的数量,这里设为 x ,那么将所有可能的x * i 加起来之后就得解。对于 i 来说,有 k / i 个可能的数字可以去添入当前数位,所以 x 暂定为 (k / i) ^ n,但是如果当前序列所有位都是不等于 i 的倍数时,最小公因子可能就会出现变化,比如 k = 8 ,i = 2时,可以尝试的倍数有 2 4 6 8其中对于4,8来说,最小公因子就为4。为了避免这种情况也被算进当前对于 i 的可行序列数量中,我们还需要减去对于 i 的倍数来说的可行序列数量(因为能够对当前序列有影响的是其他倍数之一自成序列的最大公因子)

#include<bits/stdc++.h>
#define OK cout << endl
#define f(a,j,k) for(int i = a ; i < j ; i += k)
#define f1(a,j,k) for(int i = a ; i > j ; i -= k)
using namespace std;
typedef long long ll;
typedef vector<long long> vl;
typedef vector<int> vi;
typedef pair<int,int> pri;
typedef pair<long long,long long> prl;
const ll M = 1e9 + 7;
ll Pow(ll i,ll n){
    ll ans = 1;
    while(n){
        if(n & 1) ans *= i,ans %= M;
        i *= i;
        i %= M;
        n >>= 1;
    }
  return ans;
}
void solve(){
   ll n , k;
   cin >> n >> k;
   ll ans = 0;
   ll a[k+5];
   ll res[k+5];
   f(1,k+1,1) a[i] = Pow(k/i,n) % M;
   f1(k,0,1){
      res[i] = a[i];
      for(ll j=i<<1;j <= k;j+=i)
      ((res[i]-=res[j])+=M)%=M;
   }
   f(1,k+1,1){
       (ans += res[i] * i) %= M;
   }
   cout << ans << endl;
}
int main() {
	  std::ios::sync_with_stdio(false);
	  int t;
		solve();

	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值