HGOI20181029模拟题解
HGOI20181029模拟题解
/*
sxn让我一定要谴责一下出题人和他的数据!
*/
problem:
给出十进制数a,b,然后令(R)10=(a)10*(b)10,给出c表示一个k进制数(1<k<=16)问(R)k=(c)k在k等于多少时成立,求k的最小值
如果无解输出0.
sol:显然a,b比较大的时候a*b一定爆longlong,考虑一个问题,显然若a*b>1e18那么c一定不可能等于R,一定小于等于R(主要是由于给出的c不含有字母)
然后弄个stack来求一下a*b转k进制,暴力枚举k即可,复杂度O(k*T*w)其中w是常数w=位数约等于18
code:
# include <bits/stdc++.h>
#ifdef LOCAL-ljc
#pragma GCC optimze(2)
#endif
# define int long long
using namespace std;
const int MAXN=;
char s[MAXN];
inline int read()
{
int X=,w=; char c=;
while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
while (c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void print(int x)
{
if (x<){ putchar('-');x=-x;}
if (x>) print(x/);
putchar(''+x%);
}
char val(int x)
{
if (x>=&&x<=) return x+'';
else return x-+'A';
}
bool cmp(char *s1,char *s2,int len)
{
for (int i=;i<len;i++)
if (s1[i]!=s2[i]) return false;
return true;
}
bool check(int x,int Base)
{
char E[MAXN]; stack<int>st;
int rec=x;
while (x) { st.push(x%Base); x/=Base;}
int len=;
while(!st.empty()) { E[len++]=val(st.top());st.pop();}
if (cmp(E,s,len)) return ;
else return ;
}
signed main()
{
#ifdef LOCAL-ljc
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
#else
freopen("base.in","r",stdin);
freopen("base.out","w",stdout);
#endif
int T=read();
while (T--) {
int p=read(),q=read(); int R=p*q;
if ( p> (int) (1e18) / q) {
print(),putchar('\n');
continue;
}
cin>>s;
bool f=false;
for (int i=;i<=;i++)
if (check(R,i)) { print(i); putchar('\n'); f=true; break;}
if (!f) { putchar('');putchar('\n');}
}
return ;
}
problem:给出置换关系a[]*p[]=c[] ,其中c_(p_i)=a_i,问一个有序排列[1,2,3,....n]通过最少k(k>0)次和P数组置换可以重新变成有序排列[1,2,3...n]
sol:发现置换,然后想到置换环,然后经过一次置换以后所有置换环,均向同一方向旋转一次,然后问你多少次置换重新变成有序,就是求置换环大小的lcm
按照样例来说:
其中:置换环有2个 分别是[1,3] [2,4,5]这里[]中的数组下标,然后可以发现长度是(2,3),答案就是lcm(2,3)=6
我们可以O(n)找出所有置换环,问题是求出lcm(o1,o2...ok)
显然如果输入比较大的时候lcm容易爆longlong,然后我们可以gaojing大法?
不行,不能打高精度!(看到模数)
lcm就是最小公倍数,那么对每一个数进行质因数分解
ai=Piki 然后lcm{ai}=Pimax(ki)
打质因数分解23333
我怕爆掉然后就打了两个算法。。
# include <bits/stdc++.h>
#ifdef LOCAL-ljc
#pragma GCC optimze(2)
#endif
# define int long long
using namespace std;
const int MAXN=1e5+;
const int mo=;
bool vis[MAXN];
int n,p[MAXN],ans,o[MAXN];
int max_Num;
inline int read()
{
int X=,w=; char c=;
while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
while (c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void print(int x)
{
if (x<){ putchar('-');x=-x;}
if (x>) print(x/);
putchar(''+x%);
}
int gcd(int a,int b)
{
if (b==) return a;
else return gcd(b,a%b);
}
int lcm(int a,int b){return a*b/gcd(a,b);} void dfs(int u)
{
ans++; vis[u]=true;
if (vis[p[u]]==true) return;
else dfs(p[u]);
} vector<int>P;
bool prime[MAXN];
int a[MAXN]; void getprime(int MAXN)
{
memset(prime,true,sizeof(prime));
P.clear(); prime[]=prime[]=false;
for (int i=;i<=MAXN;i++) {
if (!prime[i]) continue; P.push_back(i);
if (i+i>MAXN) continue;
for (int j=i+i;j<=MAXN;j+=i) prime[j]=false;
}
}
void in(int num)
{
for (int i=;i<P.size();i++) {
int tmp=;
while (num%P[i]==) tmp++,num/=P[i];
a[P[i]]=max(a[P[i]],tmp);
} }
int pow(int x,int n,int mo)
{
if (n==) return ;
int t=pow(x,n/,mo)%mo;
t=t*t%mo;
if (n%==) t=t*x%mo;
return t%mo;
}
int getlcm()
{
memset(a,,sizeof(a));
for (int i=;i<=o[];i++) {
int num=o[i]; in(num);
}
int ret=;
for (int i=;i<P.size();i++)
if (a[P[i]]!=) ret=ret*pow(P[i],a[P[i]],mo)%mo;
return ret;
}
signed main()
{
#ifdef LOCAL-ljc
freopen("perm.in","r",stdin);
#else
freopen("perm.in","r",stdin);
freopen("perm.out","w",stdout);
#endif
n=read();
for (int i=;i<=n;i++) p[i]=read();
memset(vis,false,sizeof(vis));
for (int i=;i<=n;i++) {
if (vis[i]) continue;
ans=;
if (vis[i]==false) dfs(i);
o[++o[]]=ans;
}
bool flag=true;
ans=;
for (int i=;i<=o[];i++) {
ans=lcm(ans,o[i]);
if (ans<) flag=false;
}
if (flag) { print(ans%mo);putchar('\n'); return ;}
ans=;
max_Num=;
for (int i=;i<=o[];i++) max_Num=max(max_Num,o[i]);
getprime(max_Num);
print(getlcm());
putchar('\n');
return ;
}
problom:算n个数都是n的二十四点
sol:打表+找规律,
若n>=12,有这样的规律,
如果n是奇数,那么可以分解为(3n)/n * (8n)/n +n-n+n-n...显然前面用掉的是(3+1+8+1=13)后面的+n-n...一定是偶数,所以可以消为0)
如果n是偶数,那么可以分解成(4n/n)*(6n)/n+n-n+n-n...显然前面用掉的是(4+1+6+1=12)后面+n-n...一定是偶数,所以可以消掉为0)
否则n<=12暴力打表算。
code:
# include <bits/stdc++.h>
using namespace std;
int main()
{
// freopen("card.in","r",stdin);
// freopen("card.out","w",stdout);
int n,tmp, T;
scanf ("%d", &T);
for (int t = ; t <= T; ++ t){
scanf ("%d", &n);
switch (n) {
case :printf("-1\n");break;
case :printf("-1\n");break;
case :printf("-1\n");break;
case :printf("1 * 2\n5 + 3\n6 + 4\n"); break;
case :printf("1 * 2\n3 / 6\n4 - 7\n5 * 8\n"); break;
case :printf("1 + 2\n3 + 4\n5 - 6\n7 + 8\n10 - 9\n"); break;
case :printf("1 + 2\n3 + 8\n9 / 4\n10 + 5\n11 + 6\n12 + 7\n"); break;
case :printf("1 + 2\n3 + 9\n4 - 5\n11 * 6\n12 * 7\n13 * 8\n10 + 14\n");break;
case :printf("1 + 2\n3 + 10\n4 / 5\n6 / 7\n8 / 9\n11 - 12\n15 - 13\n 16 - 14\n"); break;
case :printf("1 + 2\n3 / 4\n5 / 6\n7 / 8\n9 / 10\n11 + 12\n16 + 13\n17 + 14\n18 + 15\n");break;
case :printf("1 + 2\n3 / 4\n5 / 6\n7 - 8\n15 * 9\n16 * 10\n17 * 11\n12 + 13\n19 + 14\n20 + 18\n"); break;
case :printf("1 + 2\n3 - 4\n5 * 14\n6 * 15\n7 * 16\n8 * 17\n9 * 18\n10 * 19\n11 * 20\n12 * 21\n13 + 22\n"); break;
case :printf("1 + 2\n3 / 4\n5 / 6\n7 - 8\n17 * 9\n18 * 10\n19 * 11\n20 * 12\n21 * 13\n22 + 14\n23 - 15\n24 - 16\n"); break;
default: {
printf("1 + 2\n3 + 4\n5 + 6\n7 + 8\n9 + 10\n");
printf("%d + %d\n%d + %d\n%d + %d\n",n+,n+,n+,n+,n+,n+);
printf("%d / 11\n%d / 12\n",n+,n+);
printf("%d * %d\n",n+,n+);
printf("13 - 14\n");
tmp=n-;
int i;
for(i=;i<tmp;i++) printf("%d * %d\n",n++i,+i);
printf("%d + %d\n",n+,n++tmp);
}
break;
}
}
return ;
}
HGOI20181029模拟题解的更多相关文章
- 【 P3952】 时间复杂度 大模拟题解
题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ...
- HGOI20181031 模拟题解
sol:第一题就DP?!然后写了O(n^2) dp再考虑优化!!!(尽量部分分带上!!!) 我写了正确的dp然后优化错了,具体的dp方法是考虑到对于右侧到左侧他是没有后效性的 所以定义f[i]为i及以 ...
- HGOI20181030 模拟题解
problem:给定一个序列,问你能不能通过一次交换把他弄成有序 sol: 对于0%的数据,满足数列是一个排列,然后我就打了这档分(自己瞎造的!) 对于100%的数据,显然我们先对数列进行排序然后上下 ...
- CSYZDay2模拟题解
T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋 ...
- CSYZDay1模拟题解
T1.game [问题描述] LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+ ...
- 2019-06-03 校内python模拟题解(所有非原题)
一起来女装吧 本题改编自USACO(USA Computing Olympiad) 1.1节的第一题 (感谢lsy同学对本题题面的贡献) 直接计算就好了 chr:将ASCII码转成字符 ord:字符对 ...
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...
- hdu_5818_Joint Stacks(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
- CSU 1862 The Same Game(模拟)
The Same Game [题目链接]The Same Game [题目类型]模拟 &题解: 写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步. 这题我没想到 ...
随机推荐
- .NET Core中向已存在文件的特定位置写入数据
本例使用.NET Core向一个文本文件中的特定位置写入数据,来模拟文件上传中的断点续传是如何在服务器端实现的. 新建一个.NET Core控制台项目FileContinueToWrite,其Prog ...
- 【LeetCode5】Longest Palindromic Substring★★
1.题目描述: 2.解题思路: 题意:求一个字符串的最长回文子串. 方法一:中心扩展法.遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况( ...
- Postman无法正常启动解决办法
问题描述: 应用程序窗口能够打开,但就是这样一直空白,什么都不显示.接下来,主窗口以纯白色加载,不显示任何其他内容. 接下来主窗口背景米色加载和菜单栏加载和工作.应用程序将永远保持这样, 有时界面会变 ...
- Nginx 服务器的安装部署(CentOS系统)
1.准备安装环境yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-develgcc编译器 ...
- Php的常见错误及错误分析
我们在进行开发工作的时候,难免会遇到PHP的报错,解决这些错误,也是作为PHPer必须掌握的一种技能. 如果程序发生错误,我们能大致的分析出出现错误的原因,对于我们解决这戏错误会有很大的帮助. Not ...
- 20155237 第十一周java课堂程序
20155237 第十一周java课堂程序 内容一:后缀表达式 abcde/-f+ 内容二:实现Linux下dc的功能,计算后缀表达式的值 填充下列代码: import java.util.Scann ...
- C++之enum枚举量声明、定义、使用与枚举类详解
C++之enum枚举量声明.定义.使用与枚举类详解 学习一个东西,首先应该指导它能做什么,其次去知道它怎么去做,最后知道为什么去这么做. 知其然知其所以然.不能冒进 ,一步一步的慢慢来.
- tensorflow batch
这两天一直在看tensorflow中的读取数据的队列,说实话,真的是很难懂.也可能我之前没这方面的经验吧,最早我都使用的theano,什么都是自己写.经过这两天的文档以及相关资料,并且请教了国内的师弟 ...
- tkinter 弹出窗口 传值回到 主窗口
有些时候,我们需要使用弹出窗口,对程序的运行参数进行设置.有两种选择 一.标准窗口 如果只对一个参数进行设置(或者说从弹出窗口取回一个值),那么可以使用simpledialog,导入方法: from ...
- Bluedroid协议栈HCI线程分析
蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作. 本篇文章就是分析一下该线程的数据处理流程. 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_l ...