A-A+B Problem_2026牛客寒假算法基础集训营1
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long p[10],q[10],num[10]; 4 const long long m = 998244353; 5 long long ksm(int a,int b) 6 { 7 long long t = a,ans = 1; 8 while(b) 9 { 10 if(b % 2 == 1) ans = ans * t % m; 11 t = t * t % m; 12 b /= 2; 13 } 14 return ans; 15 } 16 long long cal(long long n) 17 { 18 long long ans = 1; 19 if(n == 0) ans *= num[0]*num[0]%m*num[0]%m*num[0]%m; 20 else if(n > 0 && n <= 9) ans *= num[0]*num[0]%m*num[0]%m; 21 else if(n >= 10 && n <= 99) ans *= num[0]*num[0]%m; 22 else if(n >= 100 && n <= 999) ans *= num[0]; 23 while(n) 24 { 25 ans *= num[n % 10]; 26 n /= 10; 27 ans %= m; 28 } 29 return ans; 30 } 31 //a/b mod m -> a * pow(b,m-2) 逆元 32 //why (pi/100)^56 cannot work but pi^56/100^56 does work? 33 long long inv100 = ksm(ksm(100,56),m-2); 34 int main() 35 { 36 int T,number; 37 long long ans = 0; 38 cin >> T; 39 while(T--) 40 { 41 ans = 0; 42 cin >> number; 43 for(int i = 1;i <= 7;i++) 44 { 45 cin >> p[i]; 46 p[i] = p[i]; 47 q[i] = 100 - p[i]; 48 } 49 // cautious every bulb will be tried to fire 50 num[0] = p[1]*p[2]%m*p[3]%m*q[4]%m*p[5]%m*p[6]%m*p[7]%m; 51 num[1] = q[1]*q[2]%m*p[3]%m*q[4]%m*q[5]%m*p[6]%m*q[7]%m; 52 num[2] = p[1]*q[2]%m*p[3]%m*p[4]%m*p[5]%m*q[6]%m*p[7]%m; 53 num[3] = p[1]*q[2]%m*p[3]%m*p[4]%m*q[5]%m*p[6]%m*p[7]%m; 54 num[4] = q[1]*p[2]%m*p[3]%m*p[4]%m*q[5]%m*p[6]%m*q[7]%m; 55 num[5] = p[1]*p[2]%m*q[3]%m*p[4]%m*q[5]%m*p[6]%m*p[7]%m; 56 num[6] = p[1]*p[2]%m*q[3]%m*p[4]%m*p[5]%m*p[6]%m*p[7]%m; 57 num[7] = p[1]*q[2]%m*p[3]%m*q[4]%m*q[5]%m*p[6]%m*q[7]%m; 58 num[8] = p[1]*p[2]%m*p[3]%m*p[4]%m*p[5]%m*p[6]%m*p[7]%m; 59 num[9] = p[1]*p[2]%m*p[3]%m*p[4]%m*q[5]%m*p[6]%m*p[7]%m; 60 for(int i = 0;i <= number;i++) 61 { 62 //inv100 is (1/100)^56 mod m -> pow(pow(100,56),m-2) 63 ans = (ans + cal(i) * cal(number-i) % m * inv100 ) % m; 64 } 65 cout << ans % m << endl; 66 } 67 }
浙公网安备 33010602011771号