2017第七届吉首大学“新星杯”程序设计大赛(暨新生网络同步赛)

A

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL a, b, n;
 
int main(){
    while (scanf("%lld%lld", &a, &b) != EOF) {
        scanf("%lld", &n);
        LL d = b - a;
        printf("%lld\n", a + (n - 1) * d);
    }
    return 0;
}


B

按左端点排序,然后依次合并就行

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
struct Node {
    int l, r;
}p[qq];
int a[qq], b[qq];
bool cmp(const Node &a, const Node &b) {
    if (a.l == b.l) return a.r < b.r;
    return a.l < b.l;
}
 
int main(){
    int n;
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n; ++i) {
            scanf("%d%d", &p[i].l, &p[i].r);
        }
        sort(p, p + n, cmp);
        int l, r;
        l = r = -1;
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            if (l == -1 && r == -1) {
                l = p[i].l, r = p[i].r;
            } else {
                if (p[i].l <= r) r = max(r, p[i].r);
                else    a[cnt] = l, b[cnt] = r, cnt++, l = p[i].l, r = p[i].r;
            }
        }
        a[cnt] = l, b[cnt] = r;
        cnt++;
        printf("%d\n", cnt);
        for (int i = 0; i < cnt; ++i) {
            printf("%d %d\n", a[i], b[i]);
        }
    }
    return 0;
}


C

求解ax + by = c,要求存在正整数解x,y,我们可以枚举x则 y = (c - ax) / b, 要求y是正整数

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL a, b, c;
 
int main(){
    while (scanf("%lld%lld%lld", &a, &b, &c) != EOF) {
        bool f = false;
        for (int i = 0; i <= c / a; ++i) {
            if ((c - i * a) % b == 0)   f = true;
        }
        if (!f) puts("No");
        else    puts("Yes");
    }
    return 0;
}


D

待补


E

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int num[qq];
 
int main(){
    int t;  scanf("%d", &t);
    while (t--) {
        int n;  scanf("%d", &n);
        int maxn = 0, cnt = 0;
        for (int i = 0; i < n; ++i) {
            scanf("%d", num + i);
            if (num[i] == 8)    cnt++;
            else    cnt = 0;
            maxn = max(maxn, cnt);
        }
        printf("%d\n", maxn);
    }
    return 0;
}


F

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1000000009;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
map<string, bool> mp;
char st[qq], ans[qq], cnt;
 
int main(){
    int Cas = 0;
    int t = 0;
    while (scanf("%s", st) != EOF) {
        mp.clear();
        printf("Case %d:\n", ++Cas);
        int len = strlen(st);
        cnt = 0;
        int word = 0;
        for (int i = 0; i < len; ++i) {
            if ((st[i] >= 'a' && st[i] <= 'z') || (st[i] >= 'A' && st[i] <= 'Z')) {
                ans[cnt++] = st[i];
            } else {
                if (cnt > 0) {
                    ans[cnt] = '\0';
                    if (mp.find(ans) == mp.end()) {
                        mp[ans] = true;
                        printf("%s\n", ans);
                        word++;
                    }
                     
                }
                cnt = 0;
            }
        }
        if (cnt > 0) {
            ans[cnt] = '\0';
            if (mp.find(ans) == mp.end()) {
                mp[ans] = true;
                printf("%s\n", ans);
                word++;
            }
             
        }
        if (word == 0) {
            puts("NO");
        }
        t++;
    }
    return 0;
}


G

看了看样例的输出,才发现每个运算符后面有一个空格

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 609929123;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
char flag[4] = {'+', '-', '*', '/'};
char st[55][55];
 
int main(){
    int t;  scanf("%d", &t);
    while (t--) {
        mst(st, 0);
        int n;  scanf("%d", &n);
        int x, y;
        x = y = 1;
        int cnt = 0;
        for (int i = 1; i <= n; ++i) {
            if (i % 2 == 1) {
                while (true) {
                    st[x][y] = flag[cnt % 4];
                    cnt++;
                    if (x + 1 > n || y + 1 > n)   break;
                    x += 1, y += 1;
                }
                 
            } else {
                while (true) {
                    st[x][y] = flag[cnt % 4];
                    cnt++;
                    if (x - 1 < 1 || y - 1 < 1)   break;
                    x -= 1, y -= 1;
                }
            }
            if (i % 2 == 1) y -= 1;
            else    x += 1;
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (st[i][j] == '+' || st[i][j] == '-' || st[i][j] == '*' || st[i][j] == '/') {
                    printf("%c ", st[i][j]);
                } else {
                    printf("  ");
                }
            }
            puts("");
        }
        if (t)  puts("");
    }
    return 0;
}



H

素数筛之后直接暴力枚举

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int prim[qq], top;
void init() {
    top = 0;
    for (int i = 2; i < (1 << 15); ++i) {
        bool f = true;
        for (int j = 2; j * j <= i && f; ++j) {
            if (i % j == 0) f = false;
        }
        if (f)  prim[top++] = i;   
    }
}
 
int main(){
    init();
    int n;
    while (scanf("%d", &n) != EOF) {
        if (!n) break;
//      printf("%d\n", top);
        int cnt = 0;
        for (int i = 0; i < top; ++i) {
            for (int j = i; j < top; ++j) {
                if (prim[i] + prim[j] == n) cnt++;
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}



I

这题推一推可以发现答案是 2^(n - 1)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1000000009;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL quickPow(LL a, LL b) {
    LL ans = 1;
    while (b > 0) {
        if (b & 1)  ans = (ans * a) % MOD;
        a = (a * a) % MOD;
        b >>= 1;
    }
    return ans;
}
 
int main(){
    LL n;
    while (scanf("%lld", &n) != EOF) {
        printf("%lld\n", quickPow(2, n - 1));
    }
    return 0;
}


J

做一个前缀和,然后枚举选择的其中两种宝物,利用前缀和统计包含这两种的选法一共有多少

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 609929123;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL num[qq], sum[qq];
 
int main(){
    int n;
    while (scanf("%d", &n) != EOF) {
        sum[0] = 0;
        for (int i = 1; i <= n; ++i) {
            scanf("%lld", num + i);
            sum[i] = sum[i - 1] + num[i];
        }
        LL ans = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = i + 1; j <= n; ++j) {
                ans = (ans + (num[i] * num[j]) * (sum[n] - sum[j]) % MOD) % MOD;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}


K

排个序 从最大的开始贪心

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL n, m;
LL num[qq];
 
int main(){
    while (scanf("%lld%lld", &n, &m) != EOF) {
        for (int i = 0; i < n; ++i) {
            scanf("%lld", num + i);
        }
        sort(num, num + n);
        int ans = 0;
        for (int i = n - 1; i >= 0 && m > 0; --i) {
            m -= num[i];
            ans++;
        }
        if (m > 0)   puts("-1");
        else    printf("%d\n", ans);
    }
    return 0;
}


L

如果会容斥去求1~n中与n互质的个数,那么这个题就可做了,首先求出1~n所有数的平方和,然后减去与n不互质的平方和,这一部分明显可以用容斥算

假设 2^2 + 4^2 + 6^2 .... +(2 * n)^2 = 2^2 (1^2 + 2^2 + 3^2 + ... + n^2),然后就是平方和的前n项和公式就行

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e6 + 10;
const int INF = 1e9 + 10;
bool vis[qq];
int prim[qq], top;
void init() {
    mst(vis, false);
    top = 0;
    for (int i = 2; i <= 1e6; ++i) {
        if (vis[i]) continue;
        prim[top++] = i;
        for (int j = 2; j * i <= 1e6; ++j) {
            vis[i * j] = true;
        }
    }
//  printf("%d\n", top);
}
vector<int> fact;
LL getNum(LL n, LL tmp) {
    LL num = n / tmp;
    if (num == 0)   return 0;
    LL x = tmp * tmp;
    LL y = (num * (num + 1) * (2 * num + 1) / 6);
    return x * y;
}
 
int main(){
    init();
    LL n;
    while (scanf("%lld", &n) != EOF) {
        if (n == 0 || n == 1) {
            printf("0\n");
            continue;
        }
        LL p = n;
        for (int i = 0; i < top && p >= prim[i]; ++i) {
            if (p % prim[i] == 0) {
                fact.pb(prim[i]);
                while (p % prim[i] == 0) {
                    p /= prim[i];
                }
            }
        }
        if (p > 1)   fact.pb(p);
        /*for (int i = 0; i < fact.size(); ++i) {
            printf("%d ", fact[i]);
        }
        puts("");
*/      LL ans = (n) * (n + 1) * (2LL * (n) + 1) / 6;
        LL cns = 0;
        int k = fact.size();
        for (int i = 1; i < (1 << k); ++i) {
            LL tmp = 1, cnt = 0;
            for (int j = 0; j < k; ++j) {
                if (i & (1 << j)) tmp *= fact[j], cnt++;
            }
            if (cnt & 1) cns += getNum(n, tmp);
            else    cns -= getNum(n, tmp);
//          printf("%lld %lld\n", tmp, cns);
        }
        printf("%lld\n", ans - cns);
        fact.clear();
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值