今天的模拟赛并不想做什么总结,也不想写题解。
进制
读入p; q; r,求出最小的b(2 ⩽ b ⩽ 16) 使得在b 进制下pb qb = r(pb
为p 在b 进制下的表示,比如1016 = 1610; 216 816 = 1016)。
若不存在合法的b 输出0。
1.1 输入格式
输入文件为base:in。
第一行为数据组数T。
接下来T 行每行三个整数p; q; r,其中p; q 为十进制数,r 是全由数字
构成的字符串。
1.2 输出格式
输出文件为base:out。
对于每组数据输出答案。
数据保证有解。
1.3 数据范围
令b 为最终答案,t 为b 进制下r 的大小。
对于所有数据,0 ⩽ p; q; t ⩽ 1018; 1 ⩽ T ⩽ 104。
对于60% 的数据,p; q; t ⩽ 109。
置换
对于给定的长度为n 的置换p,求最小的k 使得[1; 2 : : : n]pk = [1; 2 : : : n]。
定义置换a b = c 为,cbi = ai(1 ⩽ i ⩽ n),其中a; b; c 均为长度为n
的置换。
由于k 可能很大,请输出k mod 19184192。
2.1 输入格式
输入文件为perm:in。
第一行一个整数n。
第二行n 个整数表示p。
2.2 输出格式
输出文件为perm:out。
仅一行输出答案。
2.3 数据范围
对于所有数据,n ⩽ 105。
对于40% 的数据,n ⩽ 100。
对于60% 的数据,k ⩽ 1018。
24 点
24 点是一个大家熟知的游戏。
请求解由n 个n 组成的24 点游戏。
3.1 输入格式
输入文件为card:in。
第一行为数据组数T。
接下来T 行,每行一个整数表示n。
3.2 输出格式
输出文件为card:out。
对于每组数据,输出n ? 1 行:
若无解输出?1。
否则,令A 为长度2n ? 1 的数组,初始时81 ⩽ i ⩽ n;Ai = n,表示
初始的n 个n。
对于你输出的第i 行,格式为a op b(1 ⩽ a; b < n + i),其中op 为操
作类型(加+ 减? 乘 实数除/),该操作将Aa op Ab 赋值给An+i。
你的输出需要保证:
• A2n?1 = 24
• 每一个Ai 只被至多使用了一次
• A 中任意元素的分子分母的绝对值不大于109。
3.3 数据范围
对于所有数据
Σ
n ⩽ 105; n ⩽ 200。
对于30% 的数据n ⩽ 6。
对于50% 的数据n ⩽ 15。
对于70% 的数据n ⩽ 30。
反思一下吧:
1.代码能力还是不够强。
第一题的高精度勉勉强强过了样例,满心以为是对的,结果爆0,还不停地爆0,怎么测怎么错,说实话到现在也没发现哪里错了。。。。(最近这种情况好多,打完了自信过样例,随便做了几组小数据过了就好了,老是有一点小错误)
2.T2也是高精度,(虽然正解是分解质因数来推结论,但是高精度很直白)。。。于是调了巨久也没有调对,对于高精度取模操作,怎么调也不对,
3.T3来不及了,题解应该是24以前手推,24以后推规律
4.T4的话,时间上有一点来不及。。最后发现自己求错东西了,求的是等待时间,我做成求通过时间加上等待时间了,然后因为本身是求总时间,所以就怎么也过不去。。。。(等我研究一下再)
题解:
T1:题目中肉眼可见。
题意没有说清楚,所以明显的高精度比较稳妥。
下面给出我的代码和题解代码,求查错
我滴垃圾代码
#include<bits/stdc++.h>
using namespace std;
long long n,m,r;
long long a[110],b[110],c[110],d[220],lenr;
bool zhuan(long long x,long long y,int chu)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(d,0,sizeof(d));
int lena=0;
while (x)
{
a[++lena]=x%chu;
x/=chu;
}
int lenb=0;
while (y)
{
b[++lenb]=y%chu;
y/=chu;
}
for (int i=1; i<=lena; i++)
for (int j=1; j<=lenb; j++)
d[i+j-1]+=a[i]*b[j];
int lend=lena+lenb-1;
long long tmp=0;
for(int i=1;i<=lend;i++) tmp+=d[i],d[i]=tmp%chu,tmp/=chu;
while(tmp) d[++lend]=tmp%chu,tmp/=chu;
if(lend!=lenr) return false;
for (int i=1; i<=lend; i++)
if (d[i]!=c[i]) return false;
return true;
}
int main()
{
int T;
cin>>T;
while (T--)
{
memset(c,0,sizeof(c));
scanf("%lld%lld%lld",&n,&m,&r);
cout<<n<<" "<<m<<" "<<r<<"\n";return 0;
if((n==0||m==0)&&r==0){
printf("2\n");
continue;
}
lenr=0;
while (r)
{
c[++lenr]=r%10;
r/=10;
}
bool p=false;
for (int op=2; op<=16; op++)
{
p=zhuan(n,m,op);
if (p) {
printf("%d\n",op);break;}
}
if(!p) printf("0\n");
cout<<p<<"\n";
}
}
跟我一样方法的ak代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct lll{
int len,p[110];
void read(){
string s;cin>>s;len=s.size();
for(int i=0;i<len;i++) p[len-i]=s[i]-'0';
}
bool operator == (const lll x) const{
if(len!=x.len) return false;
for(int i=1;i<=len;i++) if(p[i]!=x.p[i]) return false;
return true;
}
void turn_it(int bas,ll t){
len=0;
while(t) p[++len]=t%bas,t/=bas;
}
void out(){
for