Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จำนวนวิธีทาสีกริด N×3 ใน C++


สมมติว่าเรามีกริดขนาด n×3 และเราต้องการทาสีทุกเซลล์ของกริดด้วยสีเพียงหนึ่งสีจากสามสี ได้แก่ แดง เหลือง และเขียว

มีเงื่อนไขคือ ไม่มีเซลล์ติดกันสองเซลล์ที่มีสีเหมือนกัน เรามี n แถวของกริด สุดท้ายเราต้องหาจำนวนวิธีที่เราสามารถทาสีกริดนี้ได้ คำตอบอาจใหญ่มาก จึงคืนค่าโมดิวโล 10^9 + 7

เช่น ถ้าอินพุตคือ 1 ผลลัพธ์จะเป็น 12

จำนวนวิธีทาสีกริด N×3 ใน C++

ในการแก้ปัญหานี้ เราจะทำตามขั้นตอนต่อไปนี้:

  • m = 10^9 + 7
  • กำหนดฟังก์ชัน add() รับ a, b คืนค่า ((a mod m) + (b mod m)) mod m
  • จาก main method: a123 := 6, a121 = 6
  • ลูป i จาก 2 ถึง n: b121 := add(3 * a121, 2 * a123), b123 := add(2 * a121, 2 * a123), a121 := b121, a123 := b123
  • คืนค่า add(a123, a121)

ตัวอย่าง

ลองดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli mod = 1e9 + 7;
class Solution {
public:
    lli add(lli a, lli b) {
        return ((a % mod) + (b % mod)) % mod;
    }
    int numOfWays(int n) {
        lli a123 = 6, a121 = 6;
        lli b123, b121;
        for (int i = 2; i <= n; i++) {
            b121 = add(3 * a121, 2 * a123);
            b123 = add(2 * a121, 2 * a123);
            a121 = b121;
            a123 = b123;
        }
        return add(a123, a121);
    }
};
main() {
    Solution ob;
    cout << (ob.numOfWays(3));
}

อินพุต

3

เอาต์พุต

246