zoukankan      html  css  js  c++  java
  • 2011 Michigan Invitational Programming Contest

    Crossings

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/gym/100463

    Description

    Given a permutation P of {0, 1, ..., n − 1}, we define the crossing number of it as follows. Write the sequence 0, 1, 2, . . . , n − 1 from left to right above the sequence P(0), P(1), . . . , P(n − 1). Draw a straignt line from 0 in the top line to 0 in the bottom line, from 1 to 1, and so on. The crossing number of P is the number of pairs of lines that cross. For example, if n = 5 and P = [1, 3, 0, 2, 4], then the crossing number of P is 3, as shown in the figure below. !""""#""""""""""""&" In this problem a permutation will be specified by a tuple (n, a, b), where n is a prime and a and b are integers (1 ≤ a ≤ n − 1 and 0 ≤ b ≤ n − 1). We call this permutation Perm(n, a, b), and the ith element of it is a ∗ i + b mod n (with i in the range [0, n − 1]). So the example above is specified by Perm(5, 2, 1).

    Input

    There are several test cases in the input file. Each test case is specified by three space-separated numbers n, a, and b on a line. The prime n will be at most 1,000,000. The input is terminated with a line containing three zeros.

    Output

    For each case in the input print out the case number followed by the crossing number of the permutation. Follow the format in the example output.

    Sample Input

    5 2 1

    19 12 7

    0 0 0

    Sample Output

    Case 1: 3

    Case 2: 77

    给你三个数n,a,b

    满足第i个数等于(a*i+b)%n,然后问你逆序数是多少

    这个n有1e6呢,所以树状数组和归并都能解决这个题吧

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e6+10;
    int d[N];
    ll n,a,b;
    void update(int x,int y) {
        while(x<=n) {
            d[x]+=y;
            x+=x&-x;
        }
    }
    int sum(int x) {
        int s=0;
        while(x>0) {
            s+=d[x];
            x-=x&-x;
        }
        return s;
    }
    int main() {
        int k=1;
        while(~scanf("%lld%lld%lld",&n,&a,&b)) {
            if(!n&&!a&&!b)
                break;
            memset(d,0,sizeof(d));
            ll ans=0;
            for(int i=0; i<n; i++) {
                int x=(a*i+b)%n+1;
                ans+=sum(x-1);
                update(x,1);
            }
            printf("Case %d: %lld
    ",k++,(n-1)*n/2-ans);
        }
    }
    大佬您太强了,还请多多指教哎
  • 相关阅读:
    windows系统Redis客户端连接远程服务器
    Linux安装JDK1.8示例
    Nexus OrientDB数据库变为只读 storage is switched to 'read only' mode
    在SQL中有时候我们需要查看现在正在SQL Server执行的命令
    注册asp.net 到 iis时出错中的一种的 解决办法
    python 装饰器
    python 类调用实例的方法
    linux 命令大全
    python多态
    python扩展字典的功能
  • 原文地址:https://www.cnblogs.com/BobHuang/p/7258369.html
Copyright © 2011-2022 走看看