2018年江西理工大学C语言程序设计竞赛高级组部分题解
B Interesting paths
考察范围:组合数学
此题是机器人走方格的变种,n*m的网格,从(1,1)走到(n,m),首先可以明确,水平要走m-1格,竖直要走n-1格,则走到目的地的任意一条路径必须走n+m-2格,呢么只要确定竖直要走的,剩下的就是水平要走的,则答案为
。
在Interseting paths要求左下角和右上角两个小矩阵不能走,则需要把整个网格依据两个小矩阵的水平和竖直边界分为两部分,依次运用组合数。例如

灰色区域之外为可走区域,分为两部分棕色,和黄色,则结果为

若是这种情况,则可分为两个

则结果为
所以需要两次分割,分别处理c到a和b到d。
因为n,m的范围比较大,可以提前预处理1到2*10^5的所有组合数和逆元。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#pragma GCC diagnostic error "-std=c++11"
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 998244353
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
;
ll fic[],jie[];
ll t,n,m,a,b,c,d;
ll quick_pow(ll x,ll y){//求逆元
ll ans=;
while(y){
) ans=ans*x%mod;
y>>=;
x=x*x%mod;
}
return ans;
}
void get_fic(){
fic[]=;
jie[]=quick_pow(fic[],mod-);
;i<=;i++){
fic[i]=fic[i-]*i%mod;
jie[i]=quick_pow(fic[i],mod-);
}
}
int main(){
get_fic();//预处理所有值
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&a,&b,&c,&d);
ll ans=;
;i<a;i++){//竖直处理
ll l=fic[b+i-]*jie[b-]%mod*jie[i-]%mod;
ll r=fic[m-b+n-i-]*jie[m-b-]%mod*jie[n-i]%mod;
ans=(ans+(l*r)%mod)%mod;
}
;i<d;i++){//水平处理
ll l=fic[c+i-]*jie[c-]%mod*jie[i-]%mod;
ll r=fic[m-i+n-c-]*jie[m-i]%mod*jie[n-c-]%mod;
ans=(ans+(l*r)%mod)%mod;
}
printf("%lld\n",ans);
}
;
}
C 三角平方数
设三角数为m,平方数为n则根据题意有n^2=(1/2)(m+1)m,化简可得 8n^2=4m^2+4m+1-1==>
(2m+1)^2-2(2n)^2=1
令x=2m+1,y=2n则有 x^2-2y^2=1可知为佩尔方程标准形式,特解为x=3,y=2,所以可以转化为矩阵乘法求任意一个解(佩尔方程)。
import java.util.*;
import java.io.*;
import java.math.*;
public class Main{
static Scanner cin=new Scanner(System.in);
static PrintWriter cout=new PrintWriter(System.out,true);
public static BigInteger[][] multiply_matrix(BigInteger[][] a,BigInteger[][] b){
BigInteger[][] c=new BigInteger[2][2];
c[0][0]=BigInteger.valueOf(0);
c[0][1]=BigInteger.valueOf(0);
c[1][0]=BigInteger.valueOf(0);
c[1][1]=BigInteger.valueOf(0);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c[i][j]=c[i][j].add(a[i][k].multiply(b[k][j]));
return c;
}
public static BigInteger quick_pow(int y){
BigInteger[][] ans=new BigInteger[2][2];
BigInteger[][] pos=new BigInteger[2][2];
ans[0][0]=BigInteger.valueOf(1);
ans[0][1]=BigInteger.valueOf(0);
ans[1][0]=BigInteger.valueOf(0);
ans[1][1]=BigInteger.valueOf(1);
pos[0][0]=BigInteger.valueOf(3);
pos[0][1]=BigInteger.valueOf(4);
pos[1][0]=BigInteger.valueOf(2);
pos[1][1]=BigInteger.valueOf(3);
while(y!=0){
if(y%2==1) ans=multiply_matrix(ans,pos);
y=y/2;
pos=multiply_matrix(pos,pos);
}
return ans[1][0];
}
public static void main(String[] args){
int n=cin.nextInt();
BigInteger result=quick_pow(n);
result=result.divide(BigInteger.valueOf(2));
cout.println(result.multiply(result));
}
}
F Star
考察范围:最小生成树
任意两个主星球之间都可以选择是否进行空间奇点压缩,选择不压缩就是三维排序,压缩就分别去掉x,y,z进行二维排序,最后跑最小生成树即可。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#pragma GCC diagnostic error "-std=c++11"
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
];
ll n,k;
struct f{
ll x,y,z;
int id;
}edge[];
struct node{
int u,v;
ll dis;
bool operator<(const node &a) const{
return a.dis>dis;
}
}e[];
int find(int x){
return fa[x]=(fa[x]==x?x:find(fa[x]));
}
bool cmp_xyz(f a,f b){//自定义排序
return a.x+a.y+a.z<b.x+b.y+b.z;
}
bool cmp_xy(f a,f b){
return a.x+a.y<b.x+b.y;
}
bool cmp_xz(f a,f b){
return a.x+a.z<b.x+b.z;
}
bool cmp_yz(f a,f b){
return a.z+a.y<b.z+b.y;
}
int main(){
scanf("%lld%lld",&n,&k);
;i<n;i++){
scanf("%lld%lld%lld",&edge[i].x,&edge[i].y,&edge[i].z);
edge[i].id=i+;
}
;i<=n;i++)
fa[i]=i;
;
sort(edge,edge+n,cmp_xyz);
;i<n;i++)
e[ans++]=(node){edge[i].id,edge[i-].id,edge[i].x+edge[i].y+edge[i].z-edge[i-].x-edge[i-].y-edge[i-].z};
sort(edge,edge+n,cmp_xy);
;i<n;i++)
e[ans++]=(node){edge[i].id,edge[i-].id,edge[i].x+edge[i].y-edge[i-].x-edge[i-].y};
sort(edge,edge+n,cmp_xz);
;i<n;i++)
e[ans++]=(node){edge[i].id,edge[i-].id,edge[i].x+edge[i].z-edge[i-].x-edge[i-].z};
sort(edge,edge+n,cmp_yz);
;i<n;i++)
e[ans++]=(node){edge[i].id,edge[i-].id,edge[i].z+edge[i].y-edge[i-].z-edge[i-].y};
;
sort(e,e+ans);
ll inf=;
;i<ans && pos>;i++){//最小生成树kruskal写法
int x=find(e[i].u);
int y=find(e[i].v);
if(x!=y){
inf+=e[i].dis;
fa[x]=y;
pos--;
}
}
printf("%lld\n",inf*k);
;
}
2018年江西理工大学C语言程序设计竞赛高级组部分题解的更多相关文章
- 2018年江西理工大学C语言程序设计竞赛(高级组) 三角平方数
题目描述 三角数:形如图a,圆点摆放成等边三角形的数字,则为三角数. (图a) 平方数:形如图b,小方块摆放成正方形的数字,则为平方数. (图b) 那么如果一个数字既是三角形数又是平方数,则称为三角平 ...
- 2018年江西理工大学C语言程序设计竞赛(初级组)一
C语言竞赛初级组第一.二场答案:https://www.cnblogs.com/xingkongyihao/p/10046918.html A: 逆序对 时间限制: 1 s 内存限制: ...
- 2014江西理工大学C语言程序设计竞赛高级组题解
1001 Beautiful Palindrome Number 枚举回文数字前半部分,然后判断该数字是否满足,复杂度为O(sqrt(n))! 1002 Recovery Sequence 本题的核 ...
- 2017年江西理工大学C语言程序设计竞赛(高级组)
问题 A: 求近似值 #include <stdio.h> #include <time.h> #include <stdlib.h> using namespac ...
- 2017年江西理工大学C语言程序设计竞赛(初级组)
问题 A: Petr的盒子(初) #include <iostream> #include <stdio.h> #include <algorithm> using ...
- 2014江西理工大学C语言程序竞赛高级组
Beautiful Palindrome Number 题意:求N里面有多少个符合要求的数字(数字要求:回文数,且前一半部分是不严格递增) 解法:打表 #include<bits/stdc++. ...
- 2016年江西理工大学C语言程序设计竞赛(高级组)
问题 A: jxust 解法:争议的问题(是输入整行还是输入字符串),这里倾向输入字符串,然后判断是否含有jxust就行 #include<bits/stdc++.h> using nam ...
- 2016年江西理工大学C语言程序设计竞赛(初级组)
问题 A: 木棒根数 解法:把所有的情况保存下来,加一下就好 #include<bits/stdc++.h> using namespace std; map<char,int> ...
- 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, ...
随机推荐
- ZBrush中如何将一个模型应用在不同的图层
我们经常会使用ZBrush®中的插入笔刷来实现快速建模,或者使用Insert笔刷创建人物四肢,那么在使用这些笔刷时,它默认是和所接触模型同在一个Subtool,如果您需要不同的材质或者雕刻手法,那么就 ...
- 网页小技巧-360doc个人图书馆复制文字
用过这个网站的人知道,当你像平时一样复制网页的地址时,这个网站会弹出如下的提示框: 这时候如果你没有账号,又不想注册.真的是一种很崩溃的感觉,但是除了注册登录外,就没有其他的办法了吗? 熟悉网页调试的 ...
- 自定义View(未完待续)
一.概述 android提供了丰富的系统控件,但在实际开发中,这些控件依然不能完全覆盖我们的需求.有时,我们需要自定义控件来满足一些个性化产品需求.自定义控件,主要有以下三种方式: 继承现有控件,对其 ...
- 【BZOJ3451】Tyvj1953 Normal - 点分治+FFT
题目来源:NOI2019模拟测试赛(七) 非原题面,题意有略微区别 题意: 吐槽: 心态崩了. 好不容易场上想出一题正解,写了三个小时结果写了个假的点分治,卡成$O(n^2)$ 我退役吧. 题解: 原 ...
- 训练1-A
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和 ...
- Codeforces 570D TREE REQUESTS dfs序+树状数组
链接 题解链接:点击打开链接 题意: 给定n个点的树.m个询问 以下n-1个数给出每一个点的父节点,1是root 每一个点有一个字母 以下n个小写字母给出每一个点的字母. 以下m行给出询问: 询问形如 ...
- C#实现调用接口数据获取数据格式化XML、json转成Table的方法
废话不多说,直接上代码: json 格式化转DataTable: result为从接口得到的数据,格式化json的方法主要来自Newtonsoft.Json JObject joUnit = JObj ...
- .NET泛型初探
总所周知,.NET出现在.net framework 2.0,为什么要在2.0引入泛型那,因为微软在开始开发.net框架时并没有想过多个类型参数传输时对方法的重构,这样一来,开发人员就要面对传输多种类 ...
- 【C++】String类中的运算符重载
模块化设计: 头文件: <span style="font-size:18px;"> #ifndef operator_operator_h #define opera ...
- h5-列表
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAX4AAAInCAIAAAAQ0aUJAAAgAElEQVR4nOy9eVxb153wnZk+z/t53n ...