답안 #492511

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
492511 2021-12-07T16:34:44 Z LittleCube Star Trek (CEOI20_startrek) C++14
컴파일 오류
0 ms 0 KB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

const ll MOD = 1000000007;

ll N, D, dp[100005][2], pre[100005];
vector<int> E[100005];

void dfs(int k)
{
    for (int i : E[k])
        if (i != pre[k])
        {
            pre[i] = k;
            dfs(i);
            if (dp[i][0] == 0 && dp[k][0] == 0)
                dp[k][0] = i;
            else if (dp[i][0] == 0)
                dp[k][1] = i;
        }
}

void reroot(int k)
{
    for (int i : E[k])
        if (i != pre[k])
        {
            if ((dp[k][0] == 0) || (dp[k][0] == i && dp[k][1] == 0))
            {
                if (dp[i][0] == 0)
                    dp[i][0] = k;
                else
                    dp[i][1] = k;
            }
            reroot(i);
        }
}

ll dfs2(int k, bool first)
{
    if (first)
        if (dp[k][1] != 0)
            return 0;
        else
            return dfs2(dp[k][0], false);
    else
    {
        int ans = 1;
        for (int i : E[k])
            if (i != pre[k])
                ans += dfs2(i, true);
        return ans;
    }
}

signed main()
{
    cin >> N >> D;
    if (N == 2)
    {
        ll p = D % (MOD - 1), b = 4;
        while (p)
        {
            if (p & 1)
                ans = (ans * b) % MOD;
            p >>= 1;
            b = b * b % MOD;
        }
        cout << ans << '\n';
        return 0;
    }
    assert(D == 1);
    for (int i = 1; i < N; i++)
    {
        int u, v;
        cin >> u >> v;
        E[u].emplace_back(v);
        E[v].emplace_back(u);
    }

    dfs(1);
    ll cnt = dfs2(1, dp[1][0] != 0);
    reroot(1);
    ll lose = 0;
    for (int i = 1; i <= N; i++)
        if (dp[i][0] == 0)
        {
            lose++;
            //cerr << i << '\n';
        }
    if (dp[1][0])
        cout << (N * N - cnt * lose) % MOD << '\n';
    else
        cout << (cnt * lose) % MOD << '\n';
}

Compilation message

startrek.cpp: In function 'int main()':
startrek.cpp:70:17: error: 'ans' was not declared in this scope; did you mean 'abs'?
   70 |                 ans = (ans * b) % MOD;
      |                 ^~~
      |                 abs
startrek.cpp:74:17: error: 'ans' was not declared in this scope; did you mean 'abs'?
   74 |         cout << ans << '\n';
      |                 ^~~
      |                 abs