T1 进制位

题目大意:自己看吧

首先让我们来看两个引理:

  • 如果有解,则进制一定为\(n - 1\)
  • 如果有解,则字母一定表示\(0\) 至 \(n - 1\) 的数

证明如下:

因为有 \(n - 1\) 个不同的数,所以最少 \(n - 1\) 进制。

假设为 \(n\) 进制,那么一定有一个数没有出现,假设为 \(k\)。

  1. 若\(k = 0\) 或 \(k = 1\),有 \(1 + (n - 1) = 10\)(\(n\)进制下) ,矛盾。

  2. \(1 < k \le n-1\) ,有\(1 + (k - 1) = k\) ,矛盾。

其它 $ > n - 1$ 进制的情况同理,所以一定是 \(n - 1\) 进制,结论 \(1\) 得证。

结论 \(1\) 成立 ,则结论 \(2\) 显然。

有了以上两个结论,这道题就好做多了。

数据范围才为 \(n \le 9\) ,直接枚举每种全排列,对每一种进行判断是否满足加法表就行了。

\(Code:\)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n,a[9],c[366666][9],tot,num[233],vis[233];
char cnm[9];
char ch[9][9][233];
inline int my_pow(int a,int b)
{
int cnm=1;
for(;b;b>>=1)
{
if(b&1) cnm=cnm*a;
a=a*a;
}
return cnm;
}
inline bool calc(int jz,int a,int b)
{
int A=num[(int)cnm[a]],B=num[(int)cnm[b]],C=0;
int siz=ch[a+1][b+1][0];
for(int i=1;i<=siz;++i)
C+=num[(int)ch[a+1][b+1][i]]*my_pow(jz,siz-i);
if(A+B<jz)
{
if(A+B==C) return true;
return false;
}
else
{
int temp=A+B;
B=temp%jz,A=temp/jz;
B+=A*jz;
if(B==C) return true;
return false;
}
}
inline void dfs(int k)
{
if(k==n-1)
{
++tot;
for(int i=0;i<n-1;++i) c[tot][i]=a[i];
return;
}
for(int i=0;i<n-1;++i)
{
if(!vis[i])
{
vis[i]=1;
a[k]=i,dfs(k+1);
vis[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
getchar();//小心换行
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
scanf("%s",ch[i][j]+1);
ch[i][j][0]=strlen(ch[i][j]+1);
}
}
for(int i=1;i<n;++i) cnm[i-1]=ch[0][i][1];
dfs(0);
for(int i=1;i<=tot;++i)
{
int sum=0;
for(int j=0;j<n-1;++j) num[(int)cnm[j]]=c[i][j];
for(int j=0;j<n-1;++j)
{
for(int k=0;k<n-1;++k)
{
if(calc(n-1,j,k)) ++sum;
}
}
if(sum==(n-1)*(n-1))
{
for(int j=0;j<n-1;++j) printf("%c=%d ",cnm[j],c[i][j]);
puts("");
printf("%d\n",n-1);return 0;
}
}
puts("ERROR!");
return 0;
}

T2 拼数

题目大意:给你\(n\)个正整数,让你把它们重新排列,使得排列后形成的数最大。

水题,直接\(STL\)切掉

\(Code:\)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
int n;
string s[23];
inline bool cmp(string a,string b) {return a+b>b+a;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) cin>>s[i];
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n;++i) cout<<s[i];
return 0;
}

T3 车站

题目大意:给你列车每一站上下车人数的规律以及终点人数,求第\(x\)站人数。

水的不能再水的题,直接上代码……

\(Code:\)

#include<cstdio>
using namespace std;
int f[23],n,m,a,x;
int main()
{
scanf("%d%d%d%d",&a,&n,&m,&x);
f[1]=1,f[2]=1;
for(int i=3;i<=n;++i) f[i]=f[i-1]+f[i-2];
if(x==1 || x==2) printf("%d",a);
else if(x==3) printf("%d",2*a);
else
{
int y=(m-a*(f[n-3]+1))/(f[n-2]-1);
printf("%d",y*(f[x-1]-1)+a*(f[x-2]+1));
}
return 0;
}

NOIP1998提高组 题解报告的更多相关文章

  1. NOIP1999提高组 题解报告

    T1 导弹拦截 题目大意:依次有\(n\) (\(n \le 10^5\))枚导弹,一套导弹拦截系统只能拦截一系列高度递减的导弹(一套系统拦截的弹道不一定相邻).求一套系统最多能拦截多少导弹,以及最少 ...

  2. NOIP2014提高组 题解报告

    D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...

  3. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  4. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

  5. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  6. NOIP 2001 提高组 题解

    NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...

  7. NOIP 2000 提高组 题解

    NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...

  8. 【NOIP2018】提高组题解

    [NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕

  9. NOIP1998 提高组

    [NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12   121 应该组成12121而非121 ...

随机推荐

  1. iview的table组件中加入超链接组件,可编辑组件,选择组件,日期组件

    这篇文章主要介绍了iview的table组件中使用选择框,日期,可编辑表格,超链接等组件. 1.select选择组件 // tableColumn数组响应对象需要传入一个固定的option数组,如果该 ...

  2. js数组转对象

    var obj = {}; var arr = [1,2,3,4,5]; for (var x in arr){ obj[x] = x; } 2.ES6的Object.assign: Object.a ...

  3. HANA数据库无法停止

    Symptom: 使用命令HDB stop多次,每次报错为timeout ----------------------- sdpadm@PRDDB01:/usr/sap/SDP/HDB66/prder ...

  4. Linux开机自动启动服务

    当我们的Linux,关机后,或者重启后,有些服务需要人工启动才能有.为了解决这个问题,我找了一个办法,用一个脚本,开机启动想启动的服务. 方法一:(强烈推荐) 1.写一个脚本auto.sh vim  ...

  5. 还想免费继续使用JDK吗?从java11以后别从Oracle下载了

    Java生态系统一直以来是建立在一个高质量的免费(零成本)JDK之上的,它可以从甲骨文(Oracle)和以前的Sun获得. 今天的情况和以前一样. Java现在每六个月发布一次版本,这个版本是指提供带 ...

  6. layui 后台分页

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Python面向对象Day2

    一.组合 给一个类的对象分组一个属性,这个属性是另一个类的对象 意义:让类的对象与另一个类的对象产生关系,也叫类与类之间产生关系(继承也能) 好处: ① 让两个类之间产生关系 ② 某一个对象是独立存在 ...

  8. Springboot整合cxf后不能访问controller,不能访问接口

    参考版本 springboot 1.4.X <=========> cxf-spring-boot-starter-jaxws 3.1.X springboot 1.5.X <=== ...

  9. 永远不会执行的cron表达式

    场景是这样的,在服务里利用sprint boot的@Scheduled(cron = "${xx.run.schedule}")定义了一个定时服务,xx.run.schedule变 ...

  10. VGridControl 使用技巧

    1. 让列的宽度自动填充 如果VGridControl的LayoutStyle属性为BandsView或SingleRecordView,那么把VGridControl的OptionsView.Aut ...