A.数学等式

数据比较小,可以暴力+折半枚举。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
map<int,int>mp;
int main()
{
int N,A,B,C,D,E; ll ans=;
scanf("%d%d%d%d%d",&A,&B,&C,&D,&E);
rep(i,-,)
rep(j,-,)
rep(k,-,){
if(i*j*k==) continue;
int x=A*i*i*i+B*j*j*j+C*k*k*k;
mp[x]++;
}
rep(i,-,)
rep(j,-,){
if(i*j==) continue;
int x=D*i*i*i+E*j*j*j;
ans+=mp[x];
}
printf("%lld\n",ans);
return ;
}

B.贪吃的细胞

最小生成树,即是S和所有的营养液连通,我们把S和营养液看成关键点,那么预处理出关键点之间的两两距离(BFS即可)。

然后从S开始,跑基于prim的最小生成树。 题中,我们需要加限制,即如果A->B要连边(A处一个细胞到B处),那么A的细胞数不能为0,而一个细胞跑到B后,变为c[B]+1个,同时用B到其他点的距离更新最小距离。

(由于std出了问题,我们先假设代码是对的。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=;
char c[maxn][maxn];
int id[maxn][maxn],vis[maxn][maxn],X[maxn],Y[maxn],Z[maxn];
int T,N,M,tot,Sx,Sy,num;
int peo[maxn],used[maxn],Dis[maxn][maxn],ans;
int xx[]={,-,,},yy[]={,,,-};
int dis[maxn][maxn][maxn],qx[maxn*maxn],qy[maxn*maxn],head,tail;
struct in{
int id,dis,from;
in(){}
in(int ii,int dd,int ff):id(ii),dis(dd),from(ff){}
friend bool operator <(in w,in v){
return w.dis>v.dis;
}
};
priority_queue<in>q;
void dfs1(int x,int y)
{
if(x<||x>N||y<||y>M||vis[x][y]||c[x][y]=='#') return ;
vis[x][y]=; if(c[x][y]>=''&&c[x][y]<='') num++;
rep(i,,) dfs1(x+xx[i],y+yy[i]);
}
void get(int p) //得到关键点和其他关键点的距离
{
rep(i,,N) rep(j,,M) dis[p][i][j]=inf;
rep(i,,tot) Dis[p][i]=inf;
head=tail=; head++;
qx[head]=X[p],qy[head]=Y[p]; dis[p][X[p]][Y[p]]=;
while(tail<head){
tail++;
int tx=qx[tail],ty=qy[tail];
rep(i,,){
int rx=tx+xx[i],ry=ty+yy[i];
if(rx>=&&rx<=N&&ry>=&&ry<=M&&c[rx][ry]!='#'&&dis[p][rx][ry]==inf){
dis[p][rx][ry]=dis[p][tx][ty]+;
if(id[rx][ry]) Dis[p][id[rx][ry]]=dis[p][rx][ry];
head++; qx[head]=rx; qy[head]=ry;
}
}
}
}
void solve()
{
rep(i,,tot) get(i);
rep(i,,tot) peo[i]=used[i]=;
peo[]=; ans=; int sz=; used[]=;
rep(i,,tot) if(Dis[][i]!=inf){
q.push(in(i,Dis[][i],)); //sz++;
}
while(!q.empty()){ //每次贪心的找最小边
in t=q.top(); q.pop();
if(t.id&&peo[t.from]&&!used[t.id]){
peo[t.from]--; used[t.id]=; ans+=t.dis;
peo[t.id]+=+Z[t.id]; sz++;
rep(i,,tot) if(!used[i]&&Dis[t.id][i]!=inf){ //来源有多的细胞,且目的地没有被用掉,则合法
q.push(in(i,Dis[t.id][i],t.id));
}
}
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%s",c[i]+);
tot=num=;
rep(i,,N) rep(j,,M) id[i][j]=vis[i][j]=;
rep(i,,N)
rep(j,,M){
if(c[i][j]>=''&&c[i][j]<='') {
id[i][j]=++tot;
X[tot]=i; Y[tot]=j; Z[tot]=c[i][j]-'';
}
else if(c[i][j]=='S'||c[i][j]=='s') X[]=Sx=i,Y[]=Sy=j;
}
dfs1(Sx,Sy);
if(num!=tot){ puts("-1"); continue;}
solve();
printf("%d\n",ans);
}
return ;
}
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=;
char c[maxn][maxn];
int id[maxn][maxn],vis[maxn][maxn],X[maxn],Y[maxn],Z[maxn];
int T,N,M,tot,Sx,Sy,num;
int peo[maxn],used[maxn],Dis[maxn][maxn],ans;
int xx[]={,-,,},yy[]={,,,-};
int dis[maxn][maxn][maxn],qx[maxn*maxn],qy[maxn*maxn],head,tail;
struct in{
int id,dis,from;
in(){}
in(int ii,int dd,int ff):id(ii),dis(dd),from(ff){}
friend bool operator <(in w,in v){
return w.dis>v.dis;
}
};
priority_queue<in>q;
void dfs1(int x,int y)
{
if(x<||x>N||y<||y>M||vis[x][y]||c[x][y]=='#') return ;
vis[x][y]=; if(c[x][y]>=''&&c[x][y]<='') num++;
rep(i,,) dfs1(x+xx[i],y+yy[i]);
}
void get(int p)
{
rep(i,,N) rep(j,,M) dis[p][i][j]=inf;
rep(i,,tot) Dis[p][i]=inf;
head=tail=; head++;
qx[head]=X[p],qy[head]=Y[p]; dis[p][X[p]][Y[p]]=;
while(tail<head){
tail++;
int tx=qx[tail],ty=qy[tail];
rep(i,,){
int rx=tx+xx[i],ry=ty+yy[i];
if(rx>=&&rx<=N&&ry>=&&ry<=M&&c[rx][ry]!='#'&&dis[p][rx][ry]==inf){
dis[p][rx][ry]=dis[p][tx][ty]+;
if(id[rx][ry]) Dis[p][id[rx][ry]]=dis[p][rx][ry];
head++; qx[head]=rx; qy[head]=ry;
}
}
}
}
void solve()
{
rep(i,,tot) get(i);
rep(i,,tot) peo[i]=used[i]=;
peo[]=; ans=; int sz=; used[]=;
rep(i,,tot) if(Dis[][i]!=inf){
q.push(in(i,Dis[][i],)); //sz++;
}
while(!q.empty()){
in t=q.top(); q.pop();
if(t.id&&peo[t.from]&&!used[t.id]){
peo[t.from]--; used[t.id]=; ans+=t.dis;
peo[t.id]+=+Z[t.id]; sz++;
rep(i,,tot) if(!used[i]&&Dis[t.id][i]!=inf){
q.push(in(i,Dis[t.id][i],t.id));
}
}
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%s",c[i]+);
tot=num=;
rep(i,,N) rep(j,,M) id[i][j]=vis[i][j]=;
rep(i,,N)
rep(j,,M){
if(c[i][j]>=''&&c[i][j]<='') {
id[i][j]=++tot;
X[tot]=i; Y[tot]=j; Z[tot]=c[i][j]-'';
}
else if(c[i][j]=='S'||c[i][j]=='s') X[]=Sx=i,Y[]=Sy=j;
}
dfs1(Sx,Sy);
if(num!=tot){ puts("-1"); continue;}
solve();
printf("%d\n",ans);
}
return

C.小爱密码 2.0

一看就是规律题,打出前面几个,发现除了前面两个其他的下标都是素数,那么我们素数筛得到所有对应的fib下标即可。 然后针对问题,我们矩阵乘法得到对应的答案,然后exgcd求逆元。(m不是素数,不能快速幂求逆元。

打表代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
ll a[];
int main()
{
a[]=; a[]=;
rep(i,,) a[i]=a[i-]+a[i-];
rep(i,,){
int f=;
rep(j,,i-) if(a[i]%a[j]==) f=;
if(!f) cout<<i<<" ";
}
return ;
}

矩阵快速幂代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
bool vis[maxn]; int p[],cnt,Mod;
void prime()
{
for(int i=;i<maxn;i++){
if(!vis[i]){
p[++cnt]=i;
if(cnt==) break;
}
for(int j=;j<=cnt&&i*p[j]<maxn;j++){
vis[i*p[j]]=;
if(i%p[j]==) break;
}
}
}
struct mat{
int m[][];
mat(){memset(m,,sizeof(m));}
friend mat operator *(mat a,mat b){
mat res;
rep(i,,)
rep(j,,)
rep(k,,) (res.m[i][j]+=1LL*a.m[i][k]*b.m[k][j]%Mod)%=Mod;
return res;
}
friend mat operator ^(mat a,int x){
mat res; res.m[][]=res.m[][]=;
while(x){
if(x&) res=res*a; a=a*a; x>>=;
} return res;
}
};
int getfib(int N)
{
mat ans,base;
ans.m[][]=ans.m[][]=;
base.m[][]=base.m[][]=base.m[][]=;
ans=(base^(N-))*ans;
return ans.m[][];
}
void exgcd(int a,int b,int d,int &x,int &y)
{
if(b==){ d=a; x=; y=; return;}
exgcd(b,a%b,d,y,x); y-=a/b*x;
}
int rev(int a,int b)
{
int x,y,d;
exgcd(a,b,d,x,y); return (x+b)%b;
}
int main()
{
prime(); int N;
p[]=; p[]=;
while(~scanf("%d%d",&N,&Mod)){
N=p[N];
int ans=getfib(N);
ans=1LL*ans*rev(,Mod)%Mod;
int L=,x=ans;
while(x){ x/=; L++;}
if(ans==) L++;
rep(i,,-L) putchar('*');
printf("%d\n",ans);
}
return ;
}

小米 OJ 编程比赛 03 月常规赛的更多相关文章

  1. 小米 OJ 编程比赛 01 月常规赛_灯_找规律

     灯 序号:#125难度:有挑战时间限制:1000ms内存限制:32M 描述 一个屋子有 n 个开关控制着 n 盏灯,但奇怪的是,每个开关对应的不是一盏灯,而是 n-1 盏灯,每次按下这个开关,其对应 ...

  2. 小米 OJ 编程比赛 02 月常规赛

    Carryon 数数字 描述 Carryon 最近迷上了数数字,然后 Starry 给了他一个区间[l,r] ,然后提了几个要求, 需要将 ll 到 rr 之间的数全部转化成 16 进制,然后连起来. ...

  3. 小米 OJ 编程比赛 02 月常规赛 3 Logic Gatekeeper CDQ分治

    link:https://code.mi.com/problem/list/view?id=139 题意: 有一个1e6 * 1e6 大的格子,现在有两种操作:1,给一个子矩阵中的每个格子加上k.2, ...

  4. 小米 oj 硬币比赛(思维+动态规划)

     硬币比赛 序号:#47难度:困难时间限制:1000ms内存限制:10M 描述 有 n 个不同价值的硬币排成一条线.有 A 与 B 两个玩家,指定由 A 开始轮流(A 先手,然后 B,然后再 A..) ...

  5. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  6. 001-电脑操作规范-2019年03月.doc

    001-电脑操作规范-2019年03月.doc   本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941   /////////////////////////////////////// ...

  7. CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

    金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...

  8. java:编程比赛中有用的方法整理(一)数组

    我曾经参加过几次编程比赛,但是当时用的是c语言,现在学习了java,打算专攻java组,故以此整理. 数组无论在哪里都必不可少. 一.数组的拷贝: 使用Arrays类的copyOf方法: 1.将一个数 ...

  9. 黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号

    <环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...

随机推荐

  1. https 不会被中间人攻击——因为中间人即使拿到了数据,也是加密的

    只要你登陆了一个使用 HTTPS 数据加密的网站,浏览的页面的内容如果被人中途看见,将会是一团乱码.它也能保证,你浏览的页面就是你想浏览的,不会被黑客在中途修改,网站收到的数据包也是你最初发的那个,不 ...

  2. angular4,angular6 父组件异步获取数据传值子组件 undefined 问题

    通过输入和输出属性 实现数据在父子组件的交互在子组件内部使用@input接受父组件传入数据,使用@output传出数据到父组件详细标准讲解参考官方文档https://angular.cn/guide/ ...

  3. python常用

    列出当前目录 import os: print os.getcwd() python load .mat variable a import scipy.io as sp tmp=sp.loadmat ...

  4. Win10系列:JavaScript 的 WinJS库

    WinJS 库是由 CSS 和 JavaScript 文件组成的.使用Visual Studio 2012新建一个JavaScript 的Windows应用商店的空白应用程序项目,在项目的引用管理器中 ...

  5. 反片语 UVA 156

    //该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母部分大小写 #include<iostream> #include<vector> #inc ...

  6. 四:(之四)基于已有镜像构建自己的Docker镜像

    4构建自己的Docker镜像 4.1常用命令: 等同于docker commit 将一个被改变的容器创建成一个新的image 等同于docker build 通过Dockerfile创建一个image ...

  7. TCP/IP协议 计算机间的通讯,传输、socket 传输通道

    #! /usr/bin/env python3 # -*- coding:utf-8 -*- #TCP/IP简介 #为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现 ...

  8. בוא--来吧--IPA--希伯来语

    灰常好听的希伯来语歌曲, Rita唱得真好.

  9. js 变量的声明能提升 初始化不会提升

    var x = 5; // 初始化 x elem = document.getElementById("demo"); // 查找元素 elem.innerHTML = x + & ...

  10. JavaScript示例

    <!DOCTYPE html> <html> <head> <title>单击按钮事件示例</title> <script langu ...