HDU 2276 Kiki & Little Kiki 2 (位运算+矩阵快速幂)
HDU 2276 Kiki Little Kiki 2 (位运算矩阵快速幂) ACM 题目地址:HDU 2276 Kiki Little Kiki 2 题意 : 一排灯,开关状态已知,每过一秒:第i个灯会根据刚才左边的那个灯的开关情况变化,如果左边是开的,它就会变化,如果是关的,就保持原来状态。问m秒后
HDU 2276 Kiki & Little Kiki 2 (位运算+矩阵快速幂)
ACM
题目地址:HDU 2276 Kiki & Little Kiki 2
题意:
一排灯,开关状态已知,每过一秒:第i个灯会根据刚才左边的那个灯的开关情况变化,如果左边是开的,它就会变化,如果是关的,就保持原来状态。问m秒后的状态。
第1个的左边是最后一个。
分析:
转移不好想啊。。。
变化是这样的:
<ol> <li><code><span>原来</span><span>左边</span><span>变化</span></code></li> <li><code><span>1</span><span>1</span><span>0</span></code></li> <li><code><span>1</span><span>0</span><span>1</span></code></li> <li><code><span>0</span><span>1</span><span>1</span></code></li> <li><code><span>0</span><span>0</span><span>0</span></code></li> </ol>
然后想到 (~原来)^(左边)=变化
发现搞不成矩阵TAT...
看了别人题解后发现:(原来+左边)&2=变化,瞬间orz。
不过这样想才没错,矩阵需要的是加法。
于是构造矩阵。见大神的矩阵:
<ol> <li><code><span>"1 0 0...0 1</span></code></li> <li><code><span> 1 1 0...0 0</span></code></li> <li><code><span> 0 1 1...0 0</span></code></li> <li><code><span> 0 0 1...0 0</span></code></li> <li><code><span> ...........</span></code></li> <li><code><span> 0 0 0...1 1</span></code></li> <li><code><span>"</span></code></li> </ol>
最后要注意,如果直接矩阵乘法%2会跪,因为数据太大了。
这时候可以用位运算优化。
我们注意到:(1+1)%2和1^1结果一样,1*1和1&1结果一样,所以相乘函数改下就行了。
代码:
/* * Author: illuz <iilluzen> * Blog: http://blog.csdn.net/hcbbt * File: 2276.cpp * Create Date: 2014-08-03 22:47:12 * Descripton: */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; #define repf(i,a,b) for(int i=(a);i>= 1; } return c; } void init() { cin >> s; int len = s.length(); a.n = b.n = c.n = len; a.init(0); b.init(0); c.init(0); repf (i, 0, len - 1) { b.v[i][0] = s[i] - '0'; } a.v[0][0] = a.v[0][a.n - 1] = 1; repf (i, 1, a.n - 1) { a.v[i][i] = a.v[i][i - 1] = 1; } } void solve(int n) { c = a ^ (n); c = c * b; repf (i, 0, c.n - 1) { printf("%d", c.v[i][0]); } puts(""); } int main() { while (~scanf("%d", &n)) { init(); solve(n); } return 0; } </cmath></algorithm></iostream></cstring></cstdio></iilluzen>

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

行列は、行と列に配置された一連の数値です。 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

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

行列は、行と列に配置された数値の 2 次元配列です。 Python には行列を表すデータ型がありませんが、ネストされたリストまたは NumPy 配列を行列として使用できます。行列の最初と最後の列要素を交換する方法については、次の入力シナリオと出力シナリオを参照してください。入出力シナリオ リストのリストを使用して表現された 3X3 行列があると仮定します。出力行列は、最初と最後の列要素を交換した結果の行列になります。入力行列:[1,3,4][4,5,6][7,8,3]出力行列:[4,3,1][4,5,6][3,8,7]別の行列を考えてみましょう行と列が等しくない行列。入力行列:

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

Oracle データベースは、強力なリレーショナル データベース管理システムとして、ユーザーのニーズを満たす豊富なコンピューティング操作を提供します。日々のデータベース操作において、減算演算は一般的かつ重要な演算であり、必要な結果を得るためにデータの減算演算を実現するのに役立ちます。この記事では、Oracle データベースでの減算演算に関連する手法について詳しく説明し、読者がこの関数をよりよく理解して使用できるように、具体的なコード例を示します。 1. Oracle データにおける減算演算の基本概念
