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

โปรแกรม C++ เพื่อค้นหาคู่ของลำดับที่ลำดับถือองค์ประกอบต่ำสุดและสูงสุด


สมมติว่าเรามีตัวเลขสามตัว N, M และ K มี N แถวแนวนอนและ M แถวแนวตั้ง เราจะเขียนจำนวนเต็มระหว่าง 1 ถึง K ในแต่ละเซลล์ และกำหนดลำดับ A และ B เพื่อให้ −

  • สำหรับแต่ละ i ในช่วง 1 ถึง N, A[i] เป็นองค์ประกอบขั้นต่ำในแถว ith

  • สำหรับแต่ละ j ในช่วง 1 ถึง M, B[j] เป็นองค์ประกอบสูงสุดในคอลัมน์ jth

เราต้องหาจำนวนคู่ (A, B) หากคำตอบมีขนาดใหญ่เกินไป ให้คืนค่า mod ผลลัพธ์ 998244353

ดังนั้นหากอินพุตเป็น N =2; ม =2; K =2 แล้วผลลัพธ์จะเป็น 7 เพราะ (A[1], A[2], B[1], B[2]) คือ (1,1,1,1), (1,1, 1,2) (1,1,2,1) (1,1,2,2) (1,2,2,2) (2,1,2,2) หรือ (2,2 ,2,2).

ขั้นตอน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

p := 998244353
Define a function power(), this will take a, b, and return (a^b) mod p
From the main method, do the following:
if n is same as 1, then:
   return power(K, m)
if m is same as 1, then:
   return power(K, n)
ans := 0
for initialize t := 1, when t <= K, update (increase t by 1), do:
   ans := (ans + (power(t, n) - power(t - 1, n) + p) mod p * power(K - t + 1, m)) mod p
return ans

ตัวอย่าง

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

#include <bits/stdc++.h>
using namespace std;

long p = 998244353;

long power(long a, long b, long ret = 1){
   for (; b; b >>= 1, a = a * a % p)
      if (b & 1)
         ret = ret * a % p;
   return ret;
}
long solve(int n, int m, int K){
   if (n == 1)
      return power(K, m);
   if (m == 1)
      return power(K, n);
   long ans = 0;
   for (long t = 1; t <= K; t++){
      ans = (ans + (power(t, n) - power(t - 1, n) + p) % p * power(K - t + 1, m)) % p;
   }
   return ans;
}
int main(){
   int N = 2;
   int M = 2;
   int K = 2;
   cout << solve(N, M, K) << endl;
}

อินพุต

2, 2, 2

ผลลัพธ์

7