The Preliminary Contest for ICPC Asia Shanghai 2019

Posted inko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Preliminary Contest for ICPC Asia Shanghai 2019相关的知识,希望对你有一定的参考价值。

D. Counting Sequences I

暴力搜索。

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

const int MOD = 1000000007;

map<vector<short>, short> m;
vector<short> vec;

void calc(int num1) 
    vector<short> tmp;
    if(num1)
        tmp.push_back(num1);
    int n = vec.size();
    int cur = 1;
    for(int i = 1; i < n; ++i) 
        if(vec[i] != vec[i - 1]) 
            tmp.push_back(cur);
            cur = 1;
         else
            ++cur;
    
    tmp.push_back(cur);
    sort(tmp.begin(), tmp.end());
    m[tmp]++;


void dfs(int last, int cur, ll pro, int sum) 
    for(int i = last; i <= 3000; ++i) 
        int tcur = cur + 1;
        ll tpro = pro * i;
        int tsum = sum + i;
        if(tpro - tsum + tcur > 3000)
            break;

        vec.push_back(i);
        calc(tpro - tsum);
        if(tpro * i - (tsum + i) + (tcur + 1) <= 3000)
            dfs(i, tcur, tpro, tsum);
        vec.pop_back();
    


ll qpow(ll x, int n) 
    ll res = 1;
    while(n) 
        if(n & 1)
            res = res * x % MOD;
        x = x * x % MOD;
        n >>= 1;
    
    return res;


int ans[3005], prod[3005], invprod[3005];

void Init() 
    dfs(2, 0, 1, 0);
    prod[0] = 1;
    for(int i = 1; i <= 3000; ++i) 
        prod[i] = 1ll * prod[i - 1] * i % MOD;
        invprod[i] = qpow(prod[i], MOD - 2);
    
    for(auto mi : m) 
        ll sum = 1;
        int len = 0;
        for(auto vi : mi.first) 
            len += vi;
            sum = (sum * invprod[vi]) % MOD;
        
        sum = (sum * prod[len]) % MOD;
        sum = (sum * mi.second) % MOD;
        ans[len] = (sum + ans[len]) % MOD;
    
    ans[0] = ans[1] = 0;


int main() 
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    Init();
    int T;
    scanf("%d", &T);
    while(T--) 
        int n;
        scanf("%d", &n);
        printf("%d\n", ans[n]);
    

H. Luhhy‘s Matrix

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;

struct Matrix 
    bitset<16> ma[16];
    Matrix() 
    void Clear() 
        for(int i = 0; i < 16; ++i)
            ma[i] = 0;
    
    void one() 
        Clear();
        for(int i = 0; i < 16; ++i)
            ma[i][i] = 1;
    
    Matrix operator*(const Matrix& t)const 
        Matrix res;
        for(int i = 0; i < 16; ++i) 
            for(int k = 0; k < 16; ++k) 
                if(ma[i][k])
                    res.ma[i] ^= t.ma[k];
            
        
        return res;
    
;

stack<Matrix> Stack1, Stack2;
Matrix ProdStack1, tmp;

void Push(uint seed, uint lastans) 
    seed ^= lastans;
    for(int i = 0; i < 16; ++i) 
        seed ^= seed * seed + 15;
        for(int j = 0; j < 16; ++j)
            tmp.ma[i][j] = (seed >> j) & 1;
    
    Stack1.push(tmp);
    ProdStack1 = tmp * ProdStack1;


void Pop() 
    if(Stack2.empty()) 
        tmp.one();
        while(!Stack1.empty()) 
            tmp = tmp * Stack1.top();
            Stack1.pop();
            Stack2.push(tmp);
        
        ProdStack1.one();
    
    Stack2.pop();


uint ans[16][16];

inline void InitAns() 
    uint p17[16], p19[16];
    p17[0] = 1, p19[0] = 1;
    for(int i = 1; i < 16; ++i) 
        p17[i] = p17[i - 1] * 17u;
        p19[i] = p19[i - 1] * 19u;
    
    for(int i = 0; i < 16; ++i) 
        for(int j = 0; j < 16; ++j)
            ans[i][j] = p17[i] * p19[j];
    


uint Calc() 
    if(Stack1.empty() && Stack2.empty())
        return 0;
    tmp = ProdStack1;
    if(!Stack2.empty())
        tmp = tmp * Stack2.top();
    uint res = 0;
    for(int i = 0; i < 16; ++i) 
        for(int j = 0; j < 16; ++j) 
            if(tmp.ma[i][j])
                res += ans[i][j];
        
    
    return res;


inline void Read(uint &x) 
    x = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9')
        ch = getchar();
    while(ch >= '0' && ch <= '9')
        x = (x << 3) + (x << 1) + ch - '0', ch = getchar();


inline void Write(uint x) 
    if(x < 10)
        putchar(x + '0');
    else 
        Write(x / 10);
        putchar(x % 10 + '0');
    


int main() 
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    InitAns();
    uint T;
    Read(T);
    while(T--) 
        while(!Stack1.empty())
            Stack1.pop();
        while(!Stack2.empty())
            Stack2.pop();
        ProdStack1.one();
        uint n, t, seed, lastans = 0;
        Read(n);
        for(int i = 1; i <= n; ++i) 
            Read(t), Read(seed);
            if(t == 1)
                Push(seed, lastans);
            else
                Pop();
            lastans = Calc();
            Write(lastans);
            putchar('\n');
        
    

以上是关于The Preliminary Contest for ICPC Asia Shanghai 2019的主要内容,如果未能解决你的问题,请参考以下文章

The Preliminary Contest for ICPC Asia Yinchuan 2019

The Preliminary Contest for ICPC Asia Shenyang 2019

The Preliminary Contest for ICPC Asia Shanghai 2019

The Preliminary Contest for ICPC Asia Shanghai 2019

The Preliminary Contest for ICPC Asia Xuzhou 2019

The Preliminary Contest for ICPC Asia Nanchang 2019