组队训练记录(7):2021CCPC威海

The 2021 CCPC Weihai Onsite
在这里插入图片描述
在这里插入图片描述
6题868罚时,rk47+。2022.10.24
这场太久之前v了 ,中间有点忘了就不写概述了。

A. Goodbye, Ziyin!

队友写的

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

const int N = 1e6 + 10;

vector<int> g[N];


inline void solve(){
    int n = 0; cin >> n;
    for(int i = 1; i <= n - 1; i++) {
        int u, v; cin >> u >> v;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
    }
    int cnt = 0;
    for(int i = 1; i <= n; i++) {
        if(g[i].size() < 3) cnt++;
        if(g[i].size() > 3) {
            cout << 0 << endl;
            return;
        }
    }
    cout << cnt << endl;
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; // cin >> t;
    while(t--) solve();
    return 0;
}

D. Period

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define ull unsigned long long
#define endl '\n'
using namespace std;

const int N = 1e6 + 10, mo = 998244353;

//ull BASE = 2748779069441;
ull BASE = 1000000009;
ull hashp[N], hashv[N];
int n;

int ans[N];

void init() {
    hashp[0] = 1;
    for(int i = 1; i <= n; i++) hashp[i] = hashp[i - 1] * BASE;
}

void get_hash(string s) {
    hashv[0] = 0;
    for(int i = 1; i <= n; i++) hashv[i] = hashv[i - 1] * BASE + s[i];
}   

ull get_sub(int l, int r) {
    int len = r - l;
    return hashv[r] - hashv[l] * hashp[len];
}

void calc() {
    for(int i = 1; i <= n - 1; i++) {
        if (get_sub(0, i) == get_sub(n- i, n)) ans[i + 1] = ans[i] + 1;
        else ans[i + 1] = ans[i];
    }
}


inline void solve(){
    string str; cin >> str, str = '@' + str;
    n = str.size() - 1;
    get_hash(str);
    init();
    calc();

    int q = 0; cin >> q;
    while(q--) {
        int i; cin >> i;
        cout << ans[min(i, (int)(n + 1 - i))] << endl;
    }
}

signed main(){
    //init();
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout << fixed << setprecision(12);
    int t = 1; //cin >> t;
    while(t--) solve();
    return 0;
}

F. Stone

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define ull unsigned long long
#define endl '\n'
using namespace std;

const int N = 1e6 + 10, mo = 998244353;

int a[N];


inline void solve(){
    int n = 0; cin >> n;
    int cnt = 0, minn = 1e18;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int fg=1;fg;){
        fg=1;
        for(int i=1;i<=n;i++){
            if(a[i]%2)fg=0;
        }
        if(fg){
            for(int i=1;i<=n;i++){
                a[i]/=2;
            }
        }
    }
    for(int i = 1; i <= n; i++) {
        if(a[i])
        if(a[i] & 1) {
            minn = min(minn, a[i]);
        }

    }
    cout<<(minn+1)/2;

}

signed main(){
    //init();
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout << fixed << setprecision(12);
    int t = 1; //cin >> t;
    while(t--) solve();
    return 0;
}

G. Shinyruo and KFC

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

const int N = 2e5 + 10, mo = 998244353;

int fc[N],inv[N],invi[N];
int ksm(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mo;
        b>>=1; a=a*a%mo;
    }
    return res;
}
int n,k;
vector<int>d;
int a[1000005],sum[1000005];
void init()
{
    fc[0]=inv[0]=1;
    int n=2e5;
    for(int i=1;i<=n;i++) fc[i]=fc[i-1]*i%mo; 
    inv[n]=ksm(fc[n],mo-2);
    for(int i=n-1;i>=1;i--)
    {
        inv[i]=inv[i+1]*(i+1)%mo;
    }
    invi[0]=1;
    for(int i=1;i<=n;i++){
        invi[i]=inv[i]*fc[i-1]%mo;
    }
}
inline void solve(){
    init();
    cin>>n>>k;
    int mx=0;
    int ans=1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        (ans*=inv[a[i]])%=mo;
        mx=max(mx,a[i]);
        sum[a[i]]++;
        if(sum[a[i]]==1)d.push_back(a[i]);
    }
    for(int i=1;i<min(mx,k+1);i++){
        cout<<0<<endl;
    }
    (ans*=ksm(fc[mx],n))%=mo;
    for(int i=1;i<=n;i++){
        (ans*=inv[mx-a[i]])%=mo;
    }
    for(int i=mx;i<=k;i++){
        cout<<ans<<endl;
        (ans*=ksm(i+1,n))%=mo;
        for(auto x:d){
            (ans*=ksm(invi[i-x+1],sum[x]))%=mo;
        }
    }

}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout << fixed << setprecision(12);
    int t = 1; //cin >> t;
    while(t--) solve();
    return 0;
}

J. Circular Billiard Table

#include <bits/stdc++.h>
#define int long long
#define ll __int128
#define endl '\n'
using namespace std;

const int N = 1e6 + 10;

vector<int> g[N];

int lcm(int x, int y) {
    ll fz = x * y;
    ll fm = __gcd(x, y);
    return (int)(fz / fm);
}

inline void solve(){
    int x, y; cin >> x >> y;
    cout << ((180 * y) / __gcd(x, 180 * y)) - 1 << endl;
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; cin >> t;
    while(t--) solve();
    return 0;
}

M. 810975

#include <bits/stdc++.h>
#define LL long long
#define int long long
using namespace std;
const int MOD=998244353;
constexpr int P(998244353), G(3), L(1 << 18);
inline void inc(int &x, int y) {
  x += y;
  if (x >= P) x -= P;
}
inline void dec(int &x, int y) {
  x -= y;
  if (x < 0) x += P;
}
inline int mod(LL x) { return x % P; }
int fpow(int x, int k = P - 2) {
  int r = 1;
  for (; k; k >>= 1, x = 1LL * x * x % P) {
    if (k & 1) r = 1LL * r * x % P;
  }
  return r;
}
int w[L], fac[L], ifac[L], inv[L], _ = [] {
  w[L / 2] = 1;
  for (int i = L / 2 + 1, x = fpow(G, (P - 1) / L); i < L; i++) w[i] = 1LL * w[i - 1] * x % P;
  for (int i = L / 2 - 1; i >= 0; i--) w[i] = w[i << 1];
  
  fac[0] = 1;
  for (int i = 1; i < L; i++) fac[i] = 1LL * fac[i - 1] * i % P;
  ifac[L - 1] = fpow(fac[L - 1]);
  for (int i = L - 1; i; i--) {
    ifac[i - 1] = 1LL * ifac[i] * i % P;
    inv[i] = 1LL * ifac[i] * fac[i - 1] % P;
  }
  return 0;
}();
void dft(int *a, int n) {
  //assert((n & n - 1) == 0);
  for (int k = n >> 1; k; k >>= 1) {
    for (int i = 0; i < n; i += k << 1) {
      for (int j = 0; j < k; j++) {
        int &x = a[i + j], y = a[i + j + k];
        a[i + j + k] = 1LL * (x - y + P) * w[k + j] % P;
        inc(x, y);
      }
    }
  }
}
void idft(int *a, int n) {
  //assert((n & n - 1) == 0);
  for (int k = 1; k < n; k <<= 1) {
    for (int i = 0; i < n; i += k << 1) {
      for (int j = 0; j < k; j++) {
        int x = a[i + j], y = 1LL * a[i + j + k] * w[k + j] % P;
        a[i + j + k] = x - y < 0 ? x - y + P : x - y;
        inc(a[i + j], y);
      }
    }
  }
  for (int i = 0, inv = P - (P - 1) / n; i < n; i++)
    a[i] = 1LL * a[i] * inv % P;
  std::reverse(a + 1, a + n);
}
inline int norm(int n) { return 1 << std::__lg(n * 2 - 1); }
struct Poly : public std::vector<int> {
#define T (*this)  
  using std::vector<int>::vector;
  void append(const Poly &r) {
    insert(end(), r.begin(), r.end());
  }
  int len() const { return size(); }
  Poly operator-() const {
    Poly r(T);
    for (auto &x : r) x = x ? P - x : 0;
    return r;
  }
  Poly &operator+=(const Poly &r) {
    if (r.len() > len()) resize(r.len());
    for (int i = 0; i < r.len(); i++) inc(T[i], r[i]);
    return T;
  }
  Poly &operator-=(const Poly &r) {
    if (r.len() > len()) resize(r.len());
    for (int i = 0; i < r.len(); i++) dec(T[i], r[i]);
    return T;
  }
  Poly &operator^=(const Poly &r) {
    if (r.len() < len()) resize(r.len());
    for (int i = 0; i < len(); i++) T[i] = 1LL * T[i] * r[i] % P;
    return T;
  }
  Poly &operator*=(int r) {
    for (int &x : T) x = 1LL * x * r % P;
    return T;
  }

  Poly operator+(const Poly &r) const { return Poly(T) += r; }
  Poly operator-(const Poly &r) const { return Poly(T) -= r; }
  Poly operator^(const Poly &r) const { return Poly(T) ^= r; }
  Poly operator*(int r) const { return Poly(T) *= r; }

  Poly &operator<<=(int k) { return insert(begin(), k, 0), T; }
  Poly operator<<(int r) const { return Poly(T) <<= r; }
  Poly operator>>(int r) const { return r >= len() ? Poly() : Poly(begin() + r, end()); }
  Poly &operator>>=(int r) { return T = T >> r; }

  Poly pre(int k) const { return k < len() ? Poly(begin(), begin() + k) : T; }
  friend void dft(Poly &a) { dft(a.data(), a.len()); }
  friend void idft(Poly &a) { idft(a.data(), a.len()); }
  friend Poly conv(const Poly &a, const Poly &b, int n) {
    Poly p(a), q;
    p.resize(n), dft(p);
    p ^= &a == &b ? p : (q = b, q.resize(n), dft(q), q);
    idft(p);
    return p;
  }
  friend Poly operator*(const Poly &a, const Poly &b) {
    int len = a.len() + b.len() - 1;
    if (a.len() <= 16 || b.len() <= 16) {
      Poly c(len);
      for (int i = 0; i < a.len(); i++)
        for (int j = 0; j < b.len(); j++)
          c[i + j] = (c[i + j] + 1LL * a[i] * b[j]) % P;
      return c;
    }
    return conv(a, b, norm(len)).pre(len);
  }

  Poly deriv() const {
    if (empty()) return Poly();
    Poly r(len() - 1);
    for (int i = 1; i < len(); i++) r[i - 1] = 1LL * i * T[i] % P;
    return r;
  }
  Poly integ() const {
    if (empty()) return Poly();
    Poly r(len() + 1);
    for (int i = 0; i < len(); i++) r[i + 1] = 1LL * fpow(i + 1) * T[i] % P;
    return r;
  }
  Poly inv(int m) const {
    Poly x = {fpow(T[0])};
    for (int k = 1; k < m; k *= 2) {
      x.append(-((conv(pre(k * 2), x, k * 2) >> k) * x).pre(k));
    }
    return x.pre(m);
  }
  Poly log(int m) const { return (deriv() * inv(m)).integ().pre(m); }
  Poly exp(int m) const {
    Poly x = {1};
    for (int k = 1; k < m; k *= 2) {
      x.append((x * (pre(k * 2) - x.log(k * 2) >> k)).pre(k));
    }
    return x.pre(m);
  }
  Poly sqrt(int m) const {
    Poly x = {1}, y = {1};
    for (int k = 1; k < m; k *= 2) {
      x.append(((pre(k * 2) - x * x >> k) * y).pre(k) * (P + 1 >> 1));
      if (k * 2 < m) {
        y.append(-((conv(x.pre(k * 2), y, k * 2) >> k) * y).pre(k));
      }
    }
    return x.pre(m);
  }

  Poly rev() const { return Poly(rbegin(), rend()); }
  Poly mulT(Poly b) { return T * b.rev() >> b.len() - 1; }

#undef T
};

Poly operator/(Poly a, Poly b) {
  int n = a.len(), m = b.len();
  if (n < m) return {0};
  int k = norm(n - m + 1);
  a = a.rev();
  a.resize(k);
  return (a * b.rev().inv(k)).pre(n - m + 1).rev();
}
std::pair<Poly, Poly> div(Poly a, Poly b) {
  int m = b.len();
  Poly c = a / b;
  return {c, a.pre(m - 1) - (b * c).pre(m - 1)};
}
Poly operator%(Poly a, Poly b) {
  return div(a, b).second;
}

struct SegTree {
  std::vector<Poly> p;
  int n, raw_n;
  SegTree(Poly a) {
    n = norm(raw_n = a.size());
    p.resize(n * 2);
    for (int i = 0; i < n; i++) {
      p[i + n] = Poly({1, i < raw_n ? P - a[i] : 0});
    }
    for (int i = n - 1; i; i--) {
      int l = i * 2, r = l | 1, k = p[l].size() - 1 << 1;
      p[l].resize(k), dft(p[l]);
      p[r].resize(k), dft(p[r]);
      idft(p[i] = p[l] ^ p[r]);
      p[i].push_back((p[i][0] - 1 + P) % P);
      p[i][0] = 1;
    }
  }
  Poly eval(Poly f) {
    int m = f.size();
    if (m == 1) return Poly(raw_n, f[0]);
    Poly q = f.rev() * p[1].inv(m);
    q.resize(m);
    if (m > n) {
      q >>= m - n;
    } else {
      q <<= n - m;
    }
    for (int k = n, o = 1; k > 1; k >>= 1) {
      for (int i = 0; i < n; i += k, o++) {
        if (i >= raw_n) continue;
        int *a = &q[i], *l = p[o * 2].data(), *r = p[o * 2 + 1].data();
        dft(a, k);
        Poly x(k), y(k);
        for (int j = 0; j < k; j++) x[j] = 1LL * a[j] * r[j] % P;
        for (int j = 0; j < k; j++) y[j] = 1LL * a[j] * l[j] % P;
        idft(x), idft(y);
        for (int j = k / 2; j < k; j++) *a++ = x[j];
        for (int j = k / 2; j < k; j++) *a++ = y[j];
      }
    }
    return q.pre(raw_n);
  }
  Poly interpolate(Poly b) {
    assert(b.len() == raw_n);
    Poly q = eval(p[1].pre(raw_n + 1).rev().deriv());
    for (int i = 0; i < raw_n; i++) q[i] = 1LL * fpow(q[i]) * b[i] % P;
    q.resize(n);
    for (int k = 1, h = n >> 1; k < n; k <<= 1, h >>= 1)
      for (int i = 0, o = h; i < n; i += k << 1, o++) {
        if (i >= raw_n) continue;
        int *a = &q[i], *b = &q[i + k], *l = p[o * 2].data(), *r = p[o * 2 + 1].data();
        Poly x(k * 2), y(k * 2);
        for (int j = 0; j < k; j++) x[j] = a[j];
        for (int j = 0; j < k; j++) y[j] = b[j];
        dft(x), dft(y);
        for (int j = 0; j < k * 2; j++) x[j] = (1LL * x[j] * r[j] + 1LL * y[j] * l[j]) % P;
        idft(x);
        for (int j = 0; j < k * 2; j++) a[j] = x[j];
      }
    q.resize(raw_n);
    return q.rev();
  }
};
int n,m,k;
Poly a,b,ans,res;
inline void solve(){
    cin>>n>>m>>k;
    if(m>n||k>m){
        cout<<0;
        return;
    }
    ans={1};
    res={1};
    a.resize(k+1);
    b.resize(k);
    for(auto &x:a)x=1;
    for(auto &x:b)x=1;
    a.resize(m+1);
    b.resize(m+1);
    for(int i=n-m+1;i;i>>=1){
        if(i%2){
            ans=ans*a;
            res=res*b;
            ans.resize(m+1);
            res.resize(m+1);
        }
        a=a*a;
        b=b*b;
        b.resize(m+1);
        a.resize(m+1);
    }
    cout<<(ans[m]-res[m]+MOD)%MOD;
}
signed main(){//2020澳门 D
    //freopen("1.in","r",stdin);
    //freopen("1.out","w",stdout);
    int _=1;
    //cin>>_;
    while(_--){
        solve();
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值