2019년 11월 4일 시뮬레이션 게임

T1 및 홀수 인자

정의 \ (F (N) \)\ N- (\) 최대 단수 요소, 예를 들어 \ (F.. (1) =. 1 \) , \ (F.. (6) =. 3 \) , \ (F. (12 =)이다 3 \) .
입력 \ (m \) 추구 \ (\ SUM \ limits_. 1 {I} = {m} ^ F. (I) \) .
\ (10 ^ {당량 m \
100} \) 분석, 우리 경우 것으로 \ (I는 \)가 짝수이다 (F.은 (I / 2) \ F. (I) =) \ 그래서기도 분할 할 수있다 .
대형 고정밀 고정밀, 시험 아에 쓰기 어려운이 문제

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 \ 당량 X \ n-당량) \ (및 \) Y (. 1 \ 당량 Y \ 당량의 m) \ (정수이다. 2 개 개의 레이저 타워 \) X (\ 좌표 \ ) Y는 \ (적어도 하나 개상의 좌표는 동시에 두 열 접촉을 가질 수있다. 상기 레이저 열 \) 경우 \ (및 \) B 관련이 \ (\) B (\와 \) C (\ 또한 연결된 ) \ 간주 될 수 \ (와 \) C $도 연결되어 있습니다. 그는 레이저 모두 링크가의 두 개의 탑을 새로운 새로운 레이저 타워 싶습니다 그래서하지만 지금은 레이저 타워, 스물 두 접촉이 필요하지 않습니다.
당신은 계산해야하고 출력 시아 오 치앙 많은 레이저 타워 건설의 최소한을 요구하는 방법.
몇 통신 블록 그것에 분명히 분리 된 세트의 유지 보수.

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