2019年11月4日シミュレーションゲーム

T1と奇数係数

定義\(F(N)\)\(N- \)最大特異因子、例えば\(F(1)= 1 \) \(F.(6)= 3 \) \(F.(12です)= 3 \) 。
入力\(M \) シーク(\ \ SUM \ limits_。1 {I} = {M} ^ F(I)\)
\(M \当量10 ^ {
100} \) 分析、我々は場合に見出さ\(I \する)偶数であり、\(F(I)= F(I / 2)\) そう祈り分割することができます。
大型高精度の高精度の書き込みに難しいこの問題は、試験ああ

r = open('sigma.in','r')
w = open('sigma.out','w')
ans = 0
def sove(*t):
    global ans
    x = int(t[0])
    if x == 0:
        return None
    if x % 2 == 1:
        ans += (x + 1) * (x + 1) // 4
    else:
        ans += x *x // 4
    sove(x // 2)
n = r.read()
sove(n)
w.write(str(ans))

もちろん、我々は再帰を追求することはできません

r = open('sigma.in', 'r')
w = open('sigma.out', 'w')
ans=  0
n = int(r.read())
while(n != 0):
    if(n & 1):
        ans += (n + 1) * (n + 1) // 4
    else:
        ans += n * n // 4
    n //= 2
w.write(str(ans))

以下は、C ++コードです。ハイフェイはあまり入れていません。
高精度クラステンプレート

signed main()
{
    freopen("sigma.in", "r", stdin);
    freopen("sigma.out", "w", stdout);
    GNUM n;
    GNUM zero(0);
    cin >> n;
    GNUM ans(0);
    while (!(n == zero))
    {
        if (n.opd())
            ans = ans + (n + 1) * (n + 1) / 4;
        else
            ans = ans + n * n / 4;
        n = n / 2;
    }
    cout << ans << endl;
    return 0;
}

アレイレーザタワーT2

小さな強いコンセンサスレーザアレイ列\(P \) N $ \タイムズMに内蔵されているシートレーザータワー、(長方形のグリッド上に各シートは、それ自体の座標レーザータワー\有する)\(X、Y)を\ (請求\) X(1 \のLeq X \ N-1当量)\(および\) Y(1 \のLeq Y \のLeq M)\(整数である。ときに、2つのレーザータワー\) X \(座標と\ ) Y \(同時に少なくとも一つの相の座標、これらの2つの列は、コンタクトを有していてもよい。もしレーザ列\)\(および\) B \(関連、\) B \(および\) C \(また連結します、 )\考慮することができる A \(と\) C $もリンクされています。彼はレーザーがリンクしている両方の二つのタワーを作る新しい新しいレーザータワーをしたいと思いますので、しかし、今のレーザータワーは必ずしも二十から二は、接触を持っていません。
あなたは、レーザータワー建設の最小値を必要とどのように多くの計算と出力Xiaoqiangする必要があります。
いくつかの通信ブロックこれで明らかに互いに素セットメンテナンス。

int main()
{
    freopen("laser.in", "r", stdin);
    freopen("laser.out", "w", stdout);
    poread(n), poread(m), poread(p);
    for(register int i = 1; i <= p; ++i)
        poread(data[i].x), poread(data[i].y), data[i].id = i;
    for(register int i = 1; i <= p; ++i)
        fa[i] = i;
    sort(data + 1, data + 1 + p, cmp1);
    for(register int i = 2; i <= p; ++i)
    {
        if(data[i - 1].x == data[i].x)
        {
            register int x = find(data[i - 1].id), y = find(data[i].id);
            if(x == y)
                continue;
            fa[y] = x;
        }
    }
    sort(data + 1, data + 1 + p, cmp2);
    for(register int i = 2; i <= p; ++i)
    {
        if(data[i - 1].y == data[i].y)
        {
            register int x = find(data[i - 1].id), y = find(data[i].id);
            if(x == y)
                continue;
            fa[y] = x;
        }
    }
    register int ans = 0;
    for(register int i = 1; i <= p; ++i)
    {
        if(find(i) == i)
        {
            ++ans;
            
        }
    }
    printf("%d", ans - 1);
}

T3 Cronicas

この問題は、問題に直面して手放す言葉の問題です。たびは、おそらく短絡が短絡から転送されて求めています。
だけのゴミ泥棒スローランニング入れ\(spfa \)

inline void sspfa()
{
    queue<int> q;
    memset(d, 0x3f, sizeof(d));
    memset(md, 0x3f, sizeof(md));
    for(register int i = 1; i <= k; ++i)
    {
        d[ek[i]] = md[ek[i]] = 0;
        g[ek[i]] = mg[ek[i]] = ek[i];
        q.push(ek[i]);
        v[ek[i]] = 1;
    }
    while(q.size())
    {
        register int x = q.front();
        q.pop();
        v[x] = 0;
        for(register int i = head[x]; i; i = e[i].nxt)
        {
            register int y = e[i].ver;
            if(d[y] > md[x] + e[i].edge)
            {
                if(g[y] != x)
                    md[y] = d[y], mg[y] = g[y];
                d[y] = md[x] + e[i].edge;
                g[y] = x;
                if(!v[y])
                    q.push(y), v[y] =  1;
            }
            else if(md[y] > md[x] + e[i].edge && g[y] != x)
            {
                md[y] = md[x] + e[i].edge;
                mg[y] = x;
                if(!v[y])
                    q.push(y), v[y] =  1;
            }
        }
    }
}

おすすめ

転載: www.cnblogs.com/Shiina-Rikka/p/11819212.html