目次
Example
Input
出力
ホームページ バックエンド開発 C++ 行と列を交換することで生成できる一意の行列の数を見つける C++ プログラム

行と列を交換することで生成できる一意の行列の数を見つける C++ プログラム

Sep 01, 2023 am 11:53 AM
マトリックス 交換 のみ

行と列を交換することで生成できる一意の行列の数を見つける C++ プログラム

n x n の行列があるとします。行列の各要素は一意であり、1 から n2 までの整数です。これで、次の操作を任意の数および順序で実行できるようになります。

  • 行列 (1 ≤ x

  • 行列 (1 ≤ x

  • xy ≤ k であり、これらの値は同じ行と列に出現できないことに注意する必要があります。

操作を実行することで取得できる一意の行列の数を調べる必要があります。

したがって、入力が n = 3、k = 15、mat = {{4, 3, 6}, {5, 9, 7}, {1, 2, 8}} のような場合、出力は 36 になります。

たとえば、選択された 2 つの値は x = 3 と y = 5 です。列を交換すると、結果の行列は -

3 4 6
9 5 7
2 1 8
ログイン後にコピー

になります。このようにして、36 個の固有の行列を取得できます。

この問題を解決するには、次の手順に従います。

Define a function dfs(), this will take k, arrays ver and visited, one stack s.
   if visited[k] is non-zero, then:
      return
   visited[k] := true
   insert k into s
   for initialize iterator j := start of ver[k], when j is not equal to last element of ver[k], update (increase j by 1), do:
      dfs(*j, ver, visited, s)
Define an array f of size: 51.
f[0] := 1
for initialize i := 1, when i <= 50, update (increase i by 1), do:
   f[i] := (i * f[i - 1]) mod modval
Define an array e of size n
Define an array pk of size n
for initialize i := 0, when i < n, update (increase i by 1), do:
   for initialize j := i + 1, when j < n, update (increase j by 1), do:
      chk := 0
         for initialize l := 0, when l < n, update (increase l by 1), do:
            if (mat[i, l] + mat[j, l]) > k, then:
               chk := 1
               Come out from the loop
         if chk is same as 0, then:
             insert j at the end of pk[i]
             insert i at the end of pk[j]
          chk := 0
          for initialize l := 0, when l < n, update (increase l by 1), do:
             if (mat[l, i] + mat[l, j]) > k, then:
                chk := 1
                Come out from the loop
           if chk is same as 0, then:
               insert j at the end of e[i]
               insert i at the end of e[j]
resa := 1, resb = 1
Define an array v1 of size: n and v2 of size: n.
for initialize i := 0, when i < n, update (increase i by 1), do:
   v1[i] := false
   v2[i] := false
for initialize i := 0, when i < n, update (increase i by 1), do:
   Define one stack s.
   if not v1[i] is non-zero, then:
      dfs(i, pk, v1, s)
      if not s is empty, then:
         resa := resa * (f[size of s])
         resa := resa mod modval
for initialize i := 0, when i < n, update (increase i by 1), do:
   Define one stack s
   if not v2[i] is non-zero, then:
      dfs(i, e, v2, s)
      if not s is empty, then:
         resb := resb * (f[size of s])
         resb := resb mod modval
print((resa * resb) mod modval)
ログイン後にコピー

Example

理解を深めるために、次の実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
#define modval 998244353
const int INF = 1e9;
void dfs(int k, vector<int> ver[], bool visited[], stack<int> &s) {
   if(visited[k])
      return;
   visited[k] = true;
   s.push(k);
   for(vector<int> :: iterator j = ver[k].begin(); j!=ver[k].end(); j++)
      dfs(*j, ver, visited, s);
}
void solve(int n, int k, vector<vector<int>> mat) {
   int f[51];
   f[0] = 1;
   for(int i = 1; i <= 50; i++) {
      f[i] = (i * f[i-1]) % modval;
   }
   vector<int> e[n];
   vector<int> pk[n];
   for(int i = 0; i < n; i++) {
      for(int j = i + 1;j < n; j++) {
         int chk = 0;
         for(int l = 0; l < n; l++){
            if((mat[i][l] + mat[j][l]) > k) {
               chk = 1;
               break;
            }
         }
         if(chk==0) {
            pk[i].push_back(j);
            pk[j].push_back(i);
         }
         chk = 0;
         for(int l = 0;l < n; l++) {
            if((mat[l][i] + mat[l][j]) > k){
               chk = 1;
               break;
            }
         }
         if(chk == 0) {
            e[i].push_back(j);
            e[j].push_back(i);
        }
      }
   }
   int resa = 1, resb = 1;
   bool v1[n], v2[n];
   for(int i = 0; i < n; i++) {
      v1[i] = false;
      v2[i] = false;
   }
   for(int i = 0;i < n; i++) {
      stack<int> s;
      if(!v1[i]) {
         dfs(i, pk, v1, s);
         if(!s.empty()) {
             resa *= (f[s.size()]) % modval;
             resa %= modval;
         }
      }
   }
   for(int i = 0 ;i < n; i++) {
      stack<int> s;
      if(!v2[i]){
         dfs(i, e, v2, s);
         if(!s.empty()) {
           resb *= (f[s.size()]) % modval;
            resb %= modval;
         }
      }
   }
   cout<< (resa * resb) % modval;
}
int main() {
   int n = 3, k = 15;
   vector<vector<int>> mat = {{4, 3, 6}, {5, 9, 7}, {1, 2, 8}};
   solve(n, k, mat);
   return 0;
}
ログイン後にコピー

Input

3, 15, {{4, 3, 6}, {5, 9, 7}, {1, 2, 8}}
ログイン後にコピー

出力

36
ログイン後にコピー

以上が行と列を交換することで生成できる一意の行列の数を見つける C++ プログラムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

人工知能の歴史とマトリックスを探る: 人工知能チュートリアル (2) 人工知能の歴史とマトリックスを探る: 人工知能チュートリアル (2) Nov 20, 2023 pm 05:25 PM

このシリーズの最初の記事では、人工知能、機械学習、深層学習、データ サイエンスなどのつながりと違いについて説明しました。また、シリーズ全体で使用するプログラミング言語やツールなどについても、いくつかの難しい選択をしました。最後に、行列の知識も少し紹介しました。この記事では、人工知能の中核であるマトリックスについて詳しく説明します。その前に、まず人工知能の歴史を理解しましょう。なぜ人工知能の歴史を理解する必要があるのでしょうか?歴史上何度もAIブームはありましたが、多くの場合、AIの可能性に対する大きな期待は実現しませんでした。人工知能の歴史を理解すると、この人工知能の波が奇跡を起こすのか、それともはじけようとしている単なるバブルなのかを知ることができます。私たち

Ubuntu 22.04 LTSにスワップスペースを追加する方法 Ubuntu 22.04 LTSにスワップスペースを追加する方法 Feb 20, 2024 am 11:12 AM

Linux システムでは、特にシステムのメモリが少ない場合に、スワップ スペースが重要な役割を果たします。これは、システムがスムーズに動作し、高負荷下でも安定性を維持できるようにするバックアップ メモリの保存スペースとして機能します。この記事では、システムのパフォーマンスが最適化され、さまざまなワークロードを処理できるようにするために、Ubuntu 22.04LTS にスワップ領域を追加するための詳細なガイドを提供します。スワップ スペースについて スワップ スペースは、システムの物理 RAM を補足するために使用される仮想メモリを提供します。システムの RAM が不足すると、カーネルはメモリ不足やシステムのクラッシュを防ぐためにデータをディスクにスワップします。 Linux システムは通常、この状況に対処するためにスワップ領域を使用します。メモリを大量に消費する複数のアプリケーションを同時に実行して、非常に大きなファイルやデータを処理します。

行列の右対角要素の合計を計算する Python プログラム 行列の右対角要素の合計を計算する Python プログラム Aug 19, 2023 am 11:29 AM

人気のある汎用プログラミング言語は Python です。デスクトップ アプリケーション、Web 開発、機械学習など、さまざまな業界で使用されています。幸いなことに、Python には初心者に適したシンプルで理解しやすい構文があります。この記事では、Python を使用して行列の右対角の合計を計算します。マトリックスとは何ですか?数学では、数学的オブジェクトまたはそのプロパティを記述するために長方形の配列または行列を使用します。これは、行と列に配置された数値、記号、または式を含む長方形の配列または表です。例: -234512367574 したがって、これは 3 行 4 列の行列であり、3*4 行列として表されます。さて、行列には​​ 2 つの対角線、主対角線と副対角線があります。

Pythonでnumpyを使用して行列またはndArrayの行列式を計算するにはどうすればよいですか? Pythonでnumpyを使用して行列またはndArrayの行列式を計算するにはどうすればよいですか? Aug 18, 2023 pm 11:57 PM

この記事では、Python の numpy ライブラリを使用して行列の行列式を計算する方法を学びます。行列の行列式は、行列をコンパクトな形式で表現できるスカラー値です。これは線形代数で有用な量であり、物理学、工学、コンピューターサイエンスなどのさまざまな分野で数多くの応用があります。この記事では、まず行列式の定義と性質について説明します。次に、numpy を使用して行列の行列式を計算する方法を学び、いくつかの例を通して実際にどのように使用されるかを見ていきます。マトリクスの行列式は、プロパティを記述するために使用できるスカラー値です。

多次元配列を使用して 2 つの行列を乗算する Python プログラム 多次元配列を使用して 2 つの行列を乗算する Python プログラム Sep 11, 2023 pm 05:09 PM

行列は、行と列に配置された一連の数値です。 m 行 n 列の行列は mXn 行列と呼ばれ、m と n はその次元と呼ばれます。行列は、リストまたは NumPy 配列を使用して Python で作成された 2 次元配列です。一般に、行列の乗算は、最初の行列の行と 2 番目の行列の列を乗算することで実行できます。ここで、最初の行列の列数は 2 番目の行列の行数と等しくなければなりません。入力シナリオと出力シナリオ 2 つの行列 A と B があるとします。これら 2 つの行列の次元は、それぞれ 2X3 と 3X2 です。乗算後の結果の行列は 2 行 1 列になります。 [b1,b2][a1,a2,a3]*[b3,b4]=[a1*b1+a2*b2+a3*a3][a4,a5,a6][b5,b6][a4*b2+a

数値の一意の素因数の積を求める C/C++ プログラム 数値の一意の素因数の積を求める C/C++ プログラム Sep 18, 2023 am 10:01 AM

固有の素因数も素数の因数です。この問題では、数値の一意の素因数すべての積を見つける必要があります。素数とは、数と 1 の 2 つの要素のみを持つ数です。ここでは、数値の一意の素因数の積を計算する最良の方法を見つけようとします。番号。問題をより明確に説明するために例を挙げてみましょう。 n=1092 という数値があり、その固有の素因数の積を見つける必要があります。 1092 の素因数は 2,3,7,13 で、その積は 546 です。 2これを見つける簡単な方法は、その数値のすべての約数を見つけて、その約数が素数かどうかを確認することです。次に数値を乗算すると、乗算変数が返されます。ここでは、Input:n=10Output:10 について説明します。

2 つの行列が等しいかどうかを比較する C プログラム 2 つの行列が等しいかどうかを比較する C プログラム Aug 31, 2023 pm 01:13 PM

ユーザーは、2 つの行列の順序と両方の行列の要素を入力する必要があります。次に、2 つの行列を比較します。行列の要素とサイズが両方とも等しい場合、2 つの行列は等しいと見なされます。行列のサイズは等しいが要素が等しくない場合、行列は比較可能ですが等しくないと示されます。サイズと要素が一致しない場合、表示マトリックスを比較することはできません。次のプログラムは C プログラムで、2 つの行列が等しいかどうかを比較するために使用されます。#include<stdio.h>#include<conio.h>main(){ intA[10][10],B[10][10] ; で

マトリックスの勘定を元に戻すにはどうすればよいですか?逆行列とはどういう意味ですか? マトリックスの勘定を元に戻すにはどうすればよいですか?逆行列とはどういう意味ですか? Mar 27, 2024 pm 12:16 PM

ソーシャル メディア運用では、マトリックス アカウントのバックフローが一般的な戦略であり、異なるアカウント間でトラフィックを誘導することで、ファンが相互に補完し合い、アクティビティを増やすことができます。マトリックス口座間の逆流には慎重な計画と実行が必要であり、簡単なことではありません。この記事では、異なるアカウント間の反転を実装する方法と反転行列の重要性について詳しく説明します。 1. マトリックスの勘定を元に戻すにはどうすればよいですか?マトリックス アカウントの中で、主要なトラフィック ソースおよびコア コンテンツを公開するプラットフォームとなるメイン アカウントを選択することが重要です。コンテンツ計画とは、一貫したコンテンツの品質とスタイルを確保するために、アカウントの特性とターゲット視聴者に基づいて対応するコンテンツ計画を策定することです。 3. お互いを勧めたり、いいねしたりする: マトリックス アカウント間でお互いを宣伝したり、いいねしたりし、ファンを合理的なレイアウトや配置でガイドします。

See all articles