2017年江西理工大学C语言程序设计竞赛(高级组)

问题 A: 求近似值

 1 #include <stdio.h>
 2 #include <time.h>
 3 #include <stdlib.h>
 4 using namespace std;
 5
 6 #define ll long long
 7 const ll M = 9e18;
 8 const ll MOD = 9932017;
 9 struct Node {
10     ll m[2][2];
11 };
12
13 ll a[4966010];
14
15 Node mul(Node a, Node b) {
16     Node A;
17     for(int i = 0; i < 2; ++i) {
18         for(int j = 0; j < 2; ++j) {
19             A.m[i][j] = 0;
20             for(int k = 0; k < 2; ++k) {
21                 A.m[i][j] = (A.m[i][j] + a.m[i][k] * b.m[k][j] % MOD) % MOD;
22             }
23         }
24     }
25     return A;
26 }
27
28 ll q(Node a, ll num) {
29     Node AA;
30     AA.m[0][0] = AA.m[1][1] = 1;
31     AA.m[0][1] = AA.m[1][0] = 0;
32     while(num) {
33         if(num & 1) AA = mul(AA, a);
34         a = mul(a, a);
35         num >>= 1;
36     }
37     return 2LL * AA.m[0][0] - 1;
38 }
39 int main() {
40     ll n;
41     int t;
42     scanf("%d", &t);
43     while(t--) {
44         scanf("%lld", &n);
45         n %= 4966009;
46         if(n > 2483005) n = 2483005*2-n-1;
47         if(a[n]){
48             printf("%lld\n", a[n]);
49             continue;
50         }
51         Node A;
52         A.m[0][0] = A.m[1][1] = 11;
53         A.m[1][0] = 60;
54         A.m[0][1] = 2;
55         //printf("%lld\n", q(A, n));
56         a[n] = q(A, n);
57         printf("%lld\n", a[n]);
58     }
59     return 0;
60 }
超级模法师
  • n % i = n - n / i * i (n / i 表示下取整)
  • 所以所求 = n * m - sum(n/i * i) (i从1到m)
  • 由于,n的第j个因子和第j+1个因子间(左开右闭),的任意数k,有n / k = n / n的第j+1个因子
  • 所以我们用sqrt(n)的时间求出所有n的因子即可,然后相邻的两个用下等差数列求和公式很容易就能算出
  • 求得过程有些坑点需要注意,首先是注意m的大小,m的大小可能位于n的两个因子之间
  • 然后是,求和公式那里也需要先求下余,再算乘法,这样就需要注意因为有个除2,所以要判断用哪一项能整除2,除完后再求余
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cmath>
 4 #define ll long long
 5 using namespace std;
 6 const int N = 1e7;
 7 const ll mod = 1e9+7;
 8 ll n , ans = 0 , m , a , b;
 9
10 int main(){
11     ll tmp =  500000004;
12     scanf("%lld%lld",&n,&m);
13     if(m > n){
14         ans = ((m - n) % mod) * (n % mod) % mod;
15         m = n;
16     }
17     if(m <= N){
18         for(int i = 1 ; i <= m ; i ++){
19             ans += (n % i);
20         }
21
22     }else{
23         for(int i = 1 ; ; i ++){
24             ll x = n / i , y = n / (i + 1) + 1;
25             if(y > m){
26                 continue;
27             }else if(x >= m && y <= m){
28                 ans += (((n % m) + (n % y)) % mod) * ((((m - y + 1) % mod) * tmp) % mod) % mod;
29
30             }else{
31                 ans += (((n % x) + (n % y)) % mod) * ((((x - y + 1) % mod) * tmp) % mod) % mod;
32             }
33             if(y <= N){
34                 for(int k = 1 ; k < y ; k ++){
35                     ans += (n % k);
36                 }
37                 break;
38             }
39         }
40     }
41     printf("%lld\n",ans % mod);
42 }
Combinationaritilize
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
    int num;
    scanf("%d",&num);
    if(num&(num-1))
        printf("no");
    else
        printf("yes");
    return 0;
}
字符串最大表示
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 using namespace std;
 5 int Next[1000005];
 6 char s[1000005];
 7 int main(){
 8     int T;
 9     scanf("%d",&T);
10     while(T --){
11         scanf("%s",s);
12         int tlen = strlen(s);
13         int j, k;
14         j = 0; k = -1; Next[0] = -1;
15         while(j < tlen){
16             if(k == -1 || s[j] == s[k])
17                 Next[++j] = ++k;
18             else
19                 k = Next[k];
20         }
21
22         printf("%d\n",tlen / (tlen - Next[tlen]));
23     }
24 }
DATE ALIVE

二分图匹配,然后上模版

 1 #include <iostream>
 2 #include <time.h>
 3 #include <stdio.h>
 4 #include <vector>
 5 #include <string.h>
 6 using namespace std;
 7 const int maxn = 509*2;
 8 int n, x, y, sum;
 9 bool vis[maxn];
10 int use[maxn];
11 vector<int> v[maxn];
12 bool Find(int x){
13     for(int i = 0; i < v[x].size(); ++i){
14         int xx = v[x][i];
15         if(!vis[xx]){
16             vis[xx] = true;
17             if(!use[xx] || Find(use[xx])){
18                 use[xx] = x;
19                 return true;
20             }
21         }
22     }
23     return false;
24 }
25 int main(){
26     int n, m, k;
27     scanf("%d%d%d", &n, &m, &k);
28     for(int i = 0; i < k; ++i){
29         scanf("%d%d", &x, &y);
30         v[x].push_back(y+501);
31     }
32     memset(use, 0, sizeof(use));
33     for(int i = 1; i <= n; ++i){
34         memset(vis, false, sizeof(vis));
35         if(Find(i)) sum ++;
36     }
37     printf("%d\n", sum);
38     for(int i = 1; i <= x; ++i){
39         v[i].clear();
40     }
41     //printf("%.3lf\n", (double)clock()/CLOCKS_PER_SEC);
42     return 0;
43 }
敏感的小明
 1 #include<bits/stdc++.h>
 2 #include<stdio.h>
 3 using namespace std;
 4 int flag[15];
 5 int main(){
 6     memset(flag,0,sizeof(flag));
 7     int n;
 8     cin>>n;
 9     int num;
10     cin>>num;
11     for(int i=0;i<num;i++){
12         int x;
13         cin>>x;
14         flag[x]=1;
15     }
16     for(int i=n;;i++){
17         int j=i;
18         int fg=1;
19         if(flag[j%10]==1){
20             fg=0;
21         }else{
22             do{
23             int y=j%10;
24             if(flag[y]==1){
25                 fg=0;
26                 break;
27             }
28             j=j/10;
29             }while(j!=0);
30         }
31         if(fg==1){
32             cout<<i<<endl;
33             break;
34         }
35     }
36     return 0;
37 }
初中数学
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<bits/stdc++.h>
 4 using namespace std;
 5 int a[1050][1050];
 6 int main(){
 7     int n,m;
 8     cin>>n>>m;
 9     int cnt=0;
10     for(int i=1;i<n+1;i++){
11         for(int j=1;j<m+1;j++){
12             cin>>a[i][j];
13             if(a[i][j]!=0){
14                 cnt+=2;
15             }
16         }
17     }
18     for(int i=1;i<n+1;i++){
19         for(int j=1;j<m+1;j++){
20             if(a[i][j]-a[i-1][j]>0){
21                 cnt+=a[i][j]-a[i-1][j];
22             }
23             if(a[i][j]-a[i+1][j]>0){
24                 cnt+=a[i][j]-a[i+1][j];
25             }
26             if(a[i][j]>a[i][j-1])
27                 cnt+=a[i][j]-a[i][j-1];
28             if(a[i][j]>a[i][j+1])
29                 cnt+=a[i][j]-a[i][j+1];
30         }
31     }
32     cout<<cnt<<endl;
33
34 }
时间: 2024-07-30 08:09:46

2017年江西理工大学C语言程序设计竞赛(高级组)的相关文章

2018年江西理工大学C语言程序设计竞赛(高级组) 三角平方数

题目描述 三角数:形如图a,圆点摆放成等边三角形的数字,则为三角数. (图a) 平方数:形如图b,小方块摆放成正方形的数字,则为平方数. (图b) 那么如果一个数字既是三角形数又是平方数,则称为三角平方数.很显然我们知道第一个三角平方数就是1了. 那么第n个三角平方数是哪个呢? 输入 输入一个正整数n (1≤n≤2001≤n≤200) 输出 输出第n个三角平方数 样例输入 1 样例输出 1 提示 来源 ismdeep 提交 我的状态 ? 2018  JustOJ     中文  English 

2015年江西理工大学C语言程序设计竞赛(初级组)

JankTao相亲记 解法:排序 #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<map> #include<set> #include<vector> #include<algorithm> using namespace std; const double INF = 1e20; const

2016年江西理工大学C语言程序设计竞赛(初级组)

Problem Description 华盛顿在寝室洗衣服,遭到了xyf的嫌弃,于是xyf出了道题给华盛顿来做(然而并没有什么关系-v-!)xyf扔给华盛顿n个字符串,这些字符串的长度不超过10000并且没有空串.有Q个询问,每个询问一个k,求出这n个字符串中的子串包含了第k个字符串的个数(详情请看hint) Input 多组测试.每组测试先输入n,Q表示n个字符串,Q个询问.(1<= n ,Q <=1e4)接下来n行每行一个字符串si,(1<= |si| <= 1e4)再接下来Q

2015年江西理工大学C语言程序设计竞赛(高级组)

A 解法:DP+二分 dp[i]=max(dp[i],dp[j]+p[i].v)(i>j) dp[i]表示建立i点之后能够获得的最大值 int n,M; struct node { int l,v; }p[1010]; int dp[1010]; bool cmp(node a,node b){ return a.l < b.l; } bool judge_oo(){ int Max = -1; for(int i = 1;i <= n;i++) Max = max(Max,p[i].v

2013年江西理工大学C语言程序设计竞赛(初级组)

ACM ICPC WORLD FINAL 解法:排序大家都知道,去重的话,初学者用数组就好了 #include<algorithm> #include<iostream> using namespace std; int main() { int a,b,c[100],i,d[31]; cin>>a; while(a>0) { cin>>b; for(i=0;i<31;i++) d[i]=0; for(i=0;i<b;i++) { cin&

开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛

规律:a[i][j]=     1/i * a[i-1][j-1]      +      (i-1)/i * a[i-1][j];  (少一个盒子时使用j-1 次魔法的概率)   (少一个盒子时使用j次魔法的概率) 公式推导如下: 设a[i][j]为打开i个盒子正好需要j次魔法的情况. ① 1->1 ② 1->1 , 2->2;        两次 1->2 , 2->1;        一次 ③ 1->1 , 2->2 , 3->3;     三次 1-

补番计划 (长沙理工大学第十一届程序设计竞赛)(双端队列+set容器+string)

补番计划 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 阿聪是一个日漫狂魔.暑假在家的时候,他有12小时在补番,12小时在睡

2017年上海金马五校程序设计竞赛

A STEED 这个字符串可以任意变换位子 找到第n个 深搜 遍历所有可能字符串 然后放到set维护  第n个就可以了 #include<stdio.h> #include<algorithm> #include<string.h> #include<string> #include<stdlib.h> #include<set> #include<iterator> #include<iostream> us

2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)

问题 I: qwb VS 去污棒 时间限制: 2 Sec  内存限制: 256 MB 提交: 74  解决: 26 [提交][状态][讨论版] 题目描述 qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月.在外人看来,他每天自言自语,其实他在和自己的影子“去污棒”聊天. 去污棒和qwb互相出题考验对方,去污棒问了qwb这样一个问题: 现已知一个有n个正整数的序列a[1],a[2]...a[n],接下来有m个操作 操作一共有两种: 1.在序列末尾添加一个数x. 2.查询suf[p] xor x的