A - Problem A. Integers Exhibition

留坑。

B - Problem B. Harvest of Apples

题意:计算$\sum_{i = 0}^{i = m}C(n, i)$

思路:由$sum_{i = 0}^{i = m}C(n,i)$可以得到$sum_{i = 0}^{i = m + 1}C(n,i)$以及$sum_{i = 0}^{i = m}C(n + 1,i)$然后用莫对算法求解

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 const ll MOD = 1e9 + ;
const int maxn = 1e5 + ; int unit;
ll inv[maxn];
ll invfac[maxn];
ll fac[maxn];
ll ans[maxn];
int n, m; struct node{
int l, r, id;
inline node(){}
inline node(int l, int r, int id) :l(l), r(r), id(id){}
inline bool operator < (const node &b) const
{
if(l / unit != b.l / unit) return l / unit < b.l / unit;
else return r < b.r;
}
}arr[maxn]; inline void Init()
{
fac[] = invfac[] = ;
fac[] = inv[] = invfac[] = ;
for(int i = ; i < maxn; ++i)
{
fac[i] = fac[i - ] * i % MOD;
inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
invfac[i] = invfac[i - ] * inv[i] % MOD;
}
} inline ll cal(int a, int b)
{
ll res = fac[a] * invfac[b] % MOD * invfac[a - b] % MOD;
return res;
} inline void work()
{
ll tmp = ;
for(int i = ; i <= arr[].r; ++i)
{
tmp = (tmp + cal(arr[].l, i)) % MOD;
}
ans[arr[].id] = tmp;
int L = arr[].l, R = arr[].r;
for(int i = ; i <= n; ++i)
{
while(L < arr[i].l)
{
tmp = (tmp * % MOD- cal(L++, R) + MOD) % MOD;
}
while(L > arr[i].l)
{
tmp = (tmp + cal(--L, R) + MOD) % MOD * inv[] % MOD;
}
while(R < arr[i].r)
{
tmp = (tmp + cal(L, ++R)) % MOD;
}
while(R > arr[i].r)
{
tmp = (tmp - cal(L, R--) + MOD) % MOD;
}
ans[arr[i].id] = tmp;
}
} int main()
{
Init();
scanf("%d", &n);
for(int i = ; i <= n; ++i)
{
scanf("%d %d", &arr[i].l, &arr[i].r);
arr[i].id = i;
}
unit = (int)sqrt(n);
sort(arr + , arr + + n);
work();
for(int i = ; i <= n; ++i)
{
printf("%lld\n", ans[i]);
}
return ;
}

C - Problem C. Problems on a Tree

留坑。

D - Problem D. Nothing is Impossible

题意:给出n道题目,每道题目有$a_i种正确选择,b_i种错误选择$ 一共有m个人,所有人都要选择一个题目集合去做,相当于去试答案,问最多能试出多少道题目答案

思路:排序,前缀积。

 #include <bits/stdc++.h>
using namespace std; #define N 110
#define ll long long struct node
{
int a, b, sum;
inline void scan()
{
scanf("%d%d", &a, &b);
sum = a + b;
}
inline bool operator < (const node &r) const
{
return sum < r.sum;
}
}arr[N]; int t, n, m;
ll sum; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i) arr[i].scan();
sort(arr + , arr + + n);
int ans = ; sum = ;
for (int i = ; i <= n; ++i)
{
sum *= arr[i].sum;
if (sum > m) break;
ans = i;
}
printf("%d\n", ans);
}
return ;
}

E - Problem E. Matrix from Arrays

题意:给出一种构造二维数组的构造方式,然后给出一个左上角,一个右下角,求这个矩形内的数和

思路:打表找规律发现,大矩阵是由若干个$2L \cdot 2L$个小矩阵构成的,那么把给出的矩阵分成四块,整块整块的处理,边边角角的处理

 #include<bits/stdc++.h>

 using namespace std;

 #define N 110

 typedef long long ll;

 int n;
int x[], y[];
ll arr[N];
ll G[N][N]; inline ll cal(int x,int y)
{
if(x < || y < ) return 0ll;
ll res = G[n - ][n - ] * (x / n) * (y / n) + G[n - ][y % n] * (x / n) + G[x % n][n - ] * (y / n) + G[x % n][y % n];
return res;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = ; i < n; ++i)
{
scanf("%lld", arr + i);
}
for(int i = , cnt = ; i < (n << ); ++i)
{
for(int j = ; j <= i; ++j)
{
G[j][i - j] = arr[cnt];
cnt = (cnt + ) % n;
}
}
n <<= ;
for(int i = ; i < n; ++i)
{
for(int j = ; j < n; ++j)
{
G[i][j] += (i ? G[i - ][j] : );
G[i][j] += (j ? G[i][j - ] : );
G[i][j] -= ((i && j) ? G[i - ][j - ] : );
}
}
int q;
scanf("%d", &q);
while(q--)
{
scanf("%d %d %d %d", &x[], &y[], &x[], &y[]);
ll ans = cal(x[], y[]) - cal(x[] - , y[]) - cal(x[], y[] - ) + cal(x[] - , y[] - );
printf("%lld\n", ans);
}
}
return ;
}
 #include <bits/stdc++.h>
using namespace std; #define N 1100
#define ll long long int t, n, q, x[], y[];
ll arr[N];
ll G[N][N]; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%lld", arr + i);
memset(G, , sizeof G);
for (int i = , cnt = ; i <= (n << ); ++i)
{
for (int j = ; j <= i; ++j)
{
G[j][i - j] = arr[cnt + ];
cnt = (cnt + ) % n;
}
}
n <<= ;
ll base = ;
for (int i = ; i < n; ++i) for (int j = ; j < n; ++j) base += G[i][j];
scanf("%d", &q);
while (q--)
{
scanf("%d%d%d%d", &x[], &y[], &x[], &y[]);
ll ans = , tmp;
//compute Big
ll xl = (x[] - x[] + ) / n, yl = (y[] - y[] + ) / n; ans += (base * xl * yl);
//compute lower_left corner
tmp = ;
for (int i = x[] + xl * n; i <= x[]; ++i)
{
for (int j = y[], cnt = ; cnt <= n; ++cnt, ++j)
tmp += G[i % n][j % n];
}
//compute upper_right corner
ans += tmp * yl; tmp = ;
for (int i = x[], cnt = ; cnt <= n; ++cnt, ++i)
{
for (int j = y[] + yl * n; j <= y[]; ++j)
tmp += G[i % n][j % n];
}
//compute lower_right corner
ans += tmp * xl; tmp = ;
for (int i = x[] + xl * n; i <= x[]; ++i)
{
for (int j = y[] + yl * n; j <= y[]; ++j)
ans += G[i % n][j % n];
}
printf("%lld\n", ans);
}
}
return ;
}

F - Problem F. Travel Through Time

留坑。

G - Problem G. Depth-First Search

留坑。

H - Problem H. Eat Cards, Have Fun

留坑。

I - Problem I. Delightful Formulas

留坑。

J - Problem J. Let Sudoku Rotate

题意:给出一个16 * 16 的数独, 有一些4 * 4 的矩阵被逆时针旋转过,然后求恢复最少需要旋转多少次

思路:爆搜,两条剪枝,一个是判断是否有冲突,一个是判断当前步数是否比已有答案大

 #include<bits/stdc++.h>

 using namespace std;

 const int maxn = 1e2 + ;

 int ans;
bool vis[];
char s[];
int G[maxn][maxn]; inline bool judge(int x,int y)
{
for(int i = x * - ; i <= x * ; ++i)
{
memset(vis, false, sizeof vis);
for(int j = ; j <= y * ; ++j)
{
if(vis[G[i][j]]) return false;
vis[G[i][j]] = true;
}
}
for(int i = y * - ; i <= y * ; ++i)
{
memset(vis, false, sizeof vis);
for(int j = ; j <= x * ; ++j)
{
if(vis[G[j][i]]) return false;
vis[G[j][i]] = true;
}
}
return true;
} inline void fun(int x, int y)
{
int tmp[][];
for(int i = ; i <= ; ++i)
{
for(int j = ; j <= ; ++j)
{
tmp[j][ - i + ] = G[(x - ) * + i][(y - ) * + j];
}
}
for(int i = ; i <= ; ++i)
{
for(int j = ; j <= ; ++j)
{
G[(x - ) * + i][(y - ) * + j] = tmp[i][j];
}
}
}
inline void DFS(int x,int y,int res)
{
if(res >= ans) return ;
if(y > )
{
DFS(x + , , res);
return ;
}
if(x == )
{
ans = min(ans, res);
return ;
}
for(int i = ; i < ; ++i)
{
if(i)
{
fun(x, y);
/* if(x == 3 && y == 1 && i == 1)
{
for(int i = x * 4 - 3; i <= x * 4; ++i)
{
for(int j = y * 4 - 3; j <= y * 4; ++j)
{
printf("%d%c", G[i][j], " \n"[j == y * 4]);
}
}
}*/
}
if(judge(x, y))
{
DFS(x, y + , res + i);
}
}
fun(x, y);
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
ans = << ;
for(int i = ; i <= ; ++i)
{
scanf("%s", s + );
for(int j = ; j <= ; ++j)
{
if(s[j] >= '' && s[j] <= '')
{
G[i][j] = s[j] - '';
}
else if(s[j] >= 'A' && s[j] <= 'F')
{
G[i][j] = (s[j] - 'A') + ;
}
}
}
// fun(1, 1);
DFS(, , );
printf("%d\n", ans);
}
return ;
}

K - Problem K. Expression in Memories

按题意模拟即可

 #include <bits/stdc++.h>
using namespace std; #define N 100010 int t;
char s[N]; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%s", s);
bool flag = true;
int len = strlen(s);
for(int i = ; i < len; ++i)
{
if(s[i] == '*' || s[i] == '+')
{
if(i == || i == len - )
{
flag = false;
break;
}
else if(s[i + ] == '*' || s[i + ] == '+')
{
flag = false;
break;
}
}
else if(s[i] == '')
{
if(i == || s[i - ] == '*' || s[i - ] == '+')
{
if(i + < len && s[i + ] >= '' && s[i + ] <= '')
{
flag = false;
break;
}
else if(s[i + ] == '?') s[i + ] = '+';
}
}
else if(s[i] == '?')
{
s[i] = '';
}
}
if(flag)
{
printf("%s\n", s);
}
else
{
printf("IMPOSSIBLE\n");
}
}
return ;
}

L - Problem L. Graph Theory Homework

水。

 #include <bits/stdc++.h>
using namespace std; #define N 100010 int t, n;
int arr[N]; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%d", arr + i);
int ans = (int)floor(sqrt(abs(arr[] - arr[n])));
printf("%d\n", ans);
}
return ;
}

2018 Multi-University Training Contest 4 Solution的更多相关文章

  1. 2018 Multi-University Training Contest 1 Solution

    A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, ...

  2. 2018 Multi-University Training Contest 2 Solution

    A - Absolute 留坑. B - Counting Permutations 留坑. C - Cover 留坑. D - Game puts("Yes") #include ...

  3. 2018 Multi-University Training Contest 3 Solution

    A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...

  4. 2018 Multi-University Training Contest 5 Solution

    A - Always Online Unsolved. B - Beautiful Now Solved. 题意: 给出一个n, k  每次可以将n这个数字上的某两位交换,最多交换k次,求交换后的最大 ...

  5. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  6. 2018 Multi-University Training Contest 7 Solution

    A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...

  7. 2018 Multi-University Training Contest 8 Solution

    A - Character Encoding 题意:用m个$0-n-1$的数去构成k,求方案数 思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时 ...

  8. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  9. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

随机推荐

  1. ArcGIS Server密码丢失

    http://jingyan.baidu.com/article/1e5468f90f6465484961b70d.html 1.cd D:\Program Files\ArcGIS\Server\t ...

  2. Nginx(三)-- 配置文件之日志管理

    1.日志文件的默认存放位置 默认的日志文件存放位置在:nginx/logs/ 文件夹下,logs文件夹下有:access.log   error.log   nginx.pid 文件 2.nginx. ...

  3. Qt监控Access数据库

    配置文件setup.ini内容 [General] DBFilePath=C:/Users/WangGang/Desktop/Database1.accdb DBUserName= DBPasswor ...

  4. java后端接收前端传来的复杂对象(包含List对象集合)

    最近在和安卓对接口的时候发现往java后端传数据的时候,后台对象无法接收. 说明:后台对象为 类似结构 ObjectA{ private String  a; private String b; pr ...

  5. android编译make错误——"javalib.jar invalid header field”、"classes-full-debug.jar 错误 41 "

    错误:读取 out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/javalib.jar 时出错:invalid header f ...

  6. poj_3630 trie树

    题目大意 给定一系列电话号码,查看他们之间是否有i,j满足,号码i是号码j的前缀子串. 题目分析 典型的trie树结构.直接使用trie树即可.但是需要注意,若使用指针形式的trie树,则在大数据量下 ...

  7. Android 7.1.1 系统截屏

    frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java Tak ...

  8. hihocoder [Offer收割]编程练习赛14 剑刃风暴

    题目4 : 剑刃风暴 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现 ...

  9. 正则表达式—RegEx(RegularExpressio)(二)

    今日随笔,继续写一些关于正则表达式的东西. 首先补一点昨天的内容: 昨天少说了一个贪婪模式,什么是贪婪模式,比如像+或者*这样的元字符匹配中,会以最大匹配值匹配,这句话是什么意思呢,例如: 定义一个正 ...

  10. 【Android】eclipse打不开的解决办法和“Jar mismatch! Fix your dependencies”的解决

    JDK1.7能用,cmd下输入java,javac,java -version,javaw配置和环境都没问题的话,有可能是工作空间的问题,就是一般在D盘下的workspace..那个文件夹,删除了,再 ...