Problem: 2050C - Uninteresting Number
Language: C++20 (GCC 13-64)

Previous submission (verdict: Memory limit exceeded on test 4):
    #include <algorithm>
    #include<bits/stdc++.h>
    #include <iostream>
    #include <unordered_set>
    #include <vector>
    using namespace std;
    using bigint = unsigned __int128;
    /*Username : arshadyasir123*/
    #define pb push_back
    #define ll long long  
    #define mii map<int,int>   
    #define pii pair<int,int>
    #define pll pair<ll,ll>
    #define ust unordered_set
    #define sti set<int> 
    #define msti multiset<int>
    #define mstl multiset<ll>
    #define ump unordered_map
    #define vi vector<int>
    #define vvi vector<vector<int>>
    #define vcc vector<vector<char>>
    #define vc vector<char> 
    #define vl vector<long long>
    #define  vb vector<bool>
    #define fl(i,a,b) for(ll i=a;i<b;i++)
    #define f(i,a,b) for(int i=a;i<b;i++)
    #define ipt(v,n) f(i,0,n){cin>>v[i];}
    #define iptl(v,n) fl(i,0,n){cin>>v[i];}   
    #define all(v) v.begin(),v.end()
    #define allr(v) v.rbegin(),v.rend()
    #define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
    #define leave continue
    #define yep cout<<"YES"<<endl
    #define nope cout<<"NO"<<endl
    template <typename tp>
    void prnt(vector<tp> v){ f(i,0,v.size()){ cout<<v[i]<<" ";}cout<<endl;}
    // void prnt(vl v){ fl(i,0,v.size()){ cout<<v[i]<<" ";}cout<<endl;}
    // void prnt(vc v){ fl(i,0,v.size()){ cout<<v[i];}cout<<endl;}
    //To Check if a number is Prime
    // bool isPrime(long long n) {
    //     if (n <= 1) {
    //         return false;
    //     }
    //     if (n <= 3) {
    //         return true;
    //     }
    //     if (n % 2 == 0 || n % 3 == 0) {
    //         return false;
    //     }
    //     for (long long i = 5; i * i <= n; i += 6) {
    //         if (n % i == 0 || n % (i + 2) == 0) {
    //             return false;
    //         }
    //     }
    //     return true;
    // }
    // Function to preprocess prime numbers using Sieve of Eratosthenes
    // vector<bool> sieve(vi max_num_vec) {
    //     int max_num=max_num_vec.size();
    //     vector<bool> is_prime(max_num + 1, true);
    //     is_prime[0] = is_prime[1] = false;
    //     for (int p = 2; p * p <= max_num; ++p) {
    //         if (is_prime[p]) {
    //             for (int i = p * p; i <= max_num; i += p)
    //                 is_prime[i] = false;
    //         }
    //     }
    //     return is_prime;
    // }
    //Generate n prime numbers using sieve
    // vector < long long > generate(int n) {
    //     int l = squeryueryrt(n) ;
    //     vector < bool > isPrime(l, true);
    //     isPrime[0] = false;
    //     isPrime[1] = false;
    //     for (int i = 2; i < l; i++) {
    //         if (isPrime[i] == true) {
    //             for (int j = i * i; j < l; j += i) {
    //                 isPrime[j] = false;
    //             }
    //         }
    //     }
    //     vector < long long > v;
    //     for (int i = 0; i < l; i++) {
    //         if (isPrime[i]) {
    //             v.push_back(i);
    //         }
    //     }
    //     return v;
    // }

    //To check for power of 2
    // bool isPowerOfTwo(long long n) {
    //     if (n <= 0) {
    //         return false;
    //     }
    //     return (ceil(log2(n)) == floor(log2(n)));
    //}
    //--------------OR---------------
    // bool isPowerOfTwo(long long n) {
    //     return (n && !(n & (n - 1)));
    // }

    //finding gcd
    // int gcd(int a, int b) {
    //     while (b != 0) {
    //         int temp = b;
    //         b = a % b;
    //         a = temp;
    //     }
    //     return a;
    // }
    // vector<int> generate_prefix(vector<int> v){
    //     int n=v.size();
    // 	vector<int> prefix(n);
    // 	prefix[0]=v[0];
    // 	for(int i=1;i<n;i++){
    // 		prefix[i]=prefix[i-1]+v[i];
    // 	}
    // 	return prefix;
    // }
    // vector<int> generateSuffixSumArray(vector<int>& arr) {
    // int n = arr.size();
    // vector<int> suffixSum(n);
    // suffixSum[n-1] = arr[n-1];
    // for (int i = n - 2; i >= 0; i--) {
    //     suffixSum[i] = arr[i] + suffixSum[i + 1];
    // }

    // return suffixSum;
    // }
    // int lcm(int a,int b){
    //     return ((a*b)/__gcd(a,b));
    // }


     int fn2(int i,string n,int sum, int ans[],vvi& dp){
        sum%=9;
        if(i>=n.size()){
            ans[sum%9]++;
            return sum%9;
        }
        if(dp[i][sum]!=-1){
            return dp[i][sum];
        }


        if(n[i]-'0'==2){
            fn2(i+1,n,(sum+4)%9,ans,dp);
            fn2(i+1,n,(sum+2)%9,ans,dp);
        }

        else if(n[i]-'0'==3){
            fn2(i+1,n,(sum+9)%9,ans,dp);
            fn2(i+1,n,(sum+3)%9,ans,dp);
        }

        return dp[i][sum]=fn2(i+1,n,sum+(n[i]-'0')%9,ans,dp);
    }
    void solve() {
        int t;
        cin >> t;
        while (t--) {
            string n;
            cin>>n;
            vvi dp(n.size(),vi(9,-1));
            auto s=n;
            int x=0;
            for(auto ch:n){
                x+= ch-'0';
            }

            if(x%9==0){
                cout<<"YES"<<endl;
            }
            else{
                int sum=0;
                int ans[]={0,0,0,0,0,0,0,0,0};
                bool a=false;
                int q=fn2(0,n,sum,ans,dp);
                
                if(ans[0]>0){
                    cout<<"YES"<<endl;
                }
                else{
                    cout<<"NO"<<endl;
                }
            }
        }
    }




    int main(){
        fastio();
        solve();
        return 0;
    }


Submission (verdict: Accepted):
    #include <algorithm>
    #include<bits/stdc++.h>
    #include <iostream>
    #include <unordered_set>
    #include <vector>
    using namespace std;
    using bigint = unsigned __int128;
    /*Username : arshadyasir123*/
    #define pb push_back
    #define ll long long  
    #define mii map<int,int>   
    #define pii pair<int,int>
    #define pll pair<ll,ll>
    #define ust unordered_set
    #define sti set<int> 
    #define msti multiset<int>
    #define mstl multiset<ll>
    #define ump unordered_map
    #define vi vector<int>
    #define vvi vector<vector<int>>
    #define vcc vector<vector<char>>
    #define vc vector<char> 
    #define vl vector<long long>
    #define  vb vector<bool>
    #define fl(i,a,b) for(ll i=a;i<b;i++)
    #define f(i,a,b) for(int i=a;i<b;i++)
    #define ipt(v,n) f(i,0,n){cin>>v[i];}
    #define iptl(v,n) fl(i,0,n){cin>>v[i];}   
    #define all(v) v.begin(),v.end()
    #define allr(v) v.rbegin(),v.rend()
    #define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
    #define leave continue
    #define yep cout<<"YES"<<endl
    #define nope cout<<"NO"<<endl
    template <typename tp>
    void prnt(vector<tp> v){ f(i,0,v.size()){ cout<<v[i]<<" ";}cout<<endl;}
    // void prnt(vl v){ fl(i,0,v.size()){ cout<<v[i]<<" ";}cout<<endl;}
    // void prnt(vc v){ fl(i,0,v.size()){ cout<<v[i];}cout<<endl;}
    //To Check if a number is Prime
    // bool isPrime(long long n) {
    //     if (n <= 1) {
    //         return false;
    //     }
    //     if (n <= 3) {
    //         return true;
    //     }
    //     if (n % 2 == 0 || n % 3 == 0) {
    //         return false;
    //     }
    //     for (long long i = 5; i * i <= n; i += 6) {
    //         if (n % i == 0 || n % (i + 2) == 0) {
    //             return false;
    //         }
    //     }
    //     return true;
    // }
    // Function to preprocess prime numbers using Sieve of Eratosthenes
    // vector<bool> sieve(vi max_num_vec) {
    //     int max_num=max_num_vec.size();
    //     vector<bool> is_prime(max_num + 1, true);
    //     is_prime[0] = is_prime[1] = false;
    //     for (int p = 2; p * p <= max_num; ++p) {
    //         if (is_prime[p]) {
    //             for (int i = p * p; i <= max_num; i += p)
    //                 is_prime[i] = false;
    //         }
    //     }
    //     return is_prime;
    // }
    //Generate n prime numbers using sieve
    // vector < long long > generate(int n) {
    //     int l = squeryueryrt(n) ;
    //     vector < bool > isPrime(l, true);
    //     isPrime[0] = false;
    //     isPrime[1] = false;
    //     for (int i = 2; i < l; i++) {
    //         if (isPrime[i] == true) {
    //             for (int j = i * i; j < l; j += i) {
    //                 isPrime[j] = false;
    //             }
    //         }
    //     }
    //     vector < long long > v;
    //     for (int i = 0; i < l; i++) {
    //         if (isPrime[i]) {
    //             v.push_back(i);
    //         }
    //     }
    //     return v;
    // }

    //To check for power of 2
    // bool isPowerOfTwo(long long n) {
    //     if (n <= 0) {
    //         return false;
    //     }
    //     return (ceil(log2(n)) == floor(log2(n)));
    //}
    //--------------OR---------------
    // bool isPowerOfTwo(long long n) {
    //     return (n && !(n & (n - 1)));
    // }

    //finding gcd
    // int gcd(int a, int b) {
    //     while (b != 0) {
    //         int temp = b;
    //         b = a % b;
    //         a = temp;
    //     }
    //     return a;
    // }
    // vector<int> generate_prefix(vector<int> v){
    //     int n=v.size();
    // 	vector<int> prefix(n);
    // 	prefix[0]=v[0];
    // 	for(int i=1;i<n;i++){
    // 		prefix[i]=prefix[i-1]+v[i];
    // 	}
    // 	return prefix;
    // }
    // vector<int> generateSuffixSumArray(vector<int>& arr) {
    // int n = arr.size();
    // vector<int> suffixSum(n);
    // suffixSum[n-1] = arr[n-1];
    // for (int i = n - 2; i >= 0; i--) {
    //     suffixSum[i] = arr[i] + suffixSum[i + 1];
    // }

    // return suffixSum;
    // }
    // int lcm(int a,int b){
    //     return ((a*b)/__gcd(a,b));
    // }

void solve() {
    int t;
    cin >> t;
    while (t--) {
        string n;
        cin >> n;

        int x = 0;
        for (auto ch : n) {
            x += ch - '0';
        }

        if (x % 9 == 0) {
            cout << "YES" << endl;
            continue;
        }

        vector<int> dp(9, 0); 
        dp[0] = 1;

        for (char ch : n) {
            int digit = ch - '0';
            vector<int> next_dp(9, 0); 

            for (int sum = 0; sum < 9; ++sum) {
                if (dp[sum]) {
                    next_dp[(sum + digit) % 9] = 1;

                    if (digit == 2) {
                        next_dp[(sum + 4) % 9] = 1;
                        next_dp[(sum + 2) % 9] = 1;
                    } else if (digit == 3) {
                        next_dp[(sum + 9) % 9] = 1;
                        next_dp[(sum + 3) % 9] = 1;
                    }
                }
            }

            dp = next_dp; 
        }

        if (dp[0]) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
}


    int main(){
        fastio();
        solve();
        return 0;
    }