• SJTU Dreadnought Contest

    • The Magic Square
    • The Kirakira Cycle
    • XOR Tree
  • Moscow SU Trinity Contest
    • Green Day

SJTU Dreadnought Contest

The Magic Square

题意:已知n≤100n\le 100, 你需要用n个边长为整数的正方形凑出一个大正方形,无解输出“Impossible”。
ps:如果加上边长互不相同就成神题了。

考场送分题,几乎全对,关键是怎么实现比较好。

法1:考虑一个正方形,中间划十字多出3个,划九宫格多出8个,然后n大可以凑出来,小数据手推。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <cstdlib>
#include <queue>
#include <stack>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
}
const int MAXN = 1000 +10;
int a[MAXN][MAXN]={0},l;
int a2[MAXN][MAXN]={0};
int n;void draw(){For(i,l) {For(j,l) printf("%d ",a[i][j]);puts("");}
}
void tian8(int &l,int &x){For(i,3*l) For(j,3*l) {if (i>l || j>l) {int t=x+(i-1)/l+(j-1)/l*3;a[i][j]=t;}}l*=3; x+=8;
}
void tian3(int &l,int &x){For(i,2*l) For(j,2*l) {if (i>l || j>l) {int t=x+(i-1)/l+(j-1)/l*2;a[i][j]=t;}}l*=2; x+=3;
}
void kuo2(int &l){For(i,l){For(j,l) a2[i*2-1][j*2-1]=a2[i*2-1][j*2]=a2[i*2][j*2-1]=a2[i*2][j*2]=a[i][j];}l*=2;For(i,l){For(j,l) a[i][j]=a2[i][j];}
}
void plus3(int A,int B,int l,int &x) {Fork(i,A,A+l-1)Fork(j,B,B+l-1) {int t=x;if (i>=A+l/2) t+=1;if (j>=B+l/2) t+=2;if (t==x) continue;a[i][j]=t;}x+=3;
}
void plus8(int A,int B,int l,int &x) {Fork(i,A,A+l-1)Fork(j,B,B+l-1) {int t=x;if (i>=A+l/3) t+=(i-A)/3;if (j>=B+l/3) t+=(j-B)/3;if (t==x) continue;a[i][j]=t;}x+=8;
}
pair<pair<int,int> , int>  q[10000];
int head=1,tail=1;
void draw2() {Fork(i,head,tail) {
//      printf("%d,%d  %d\n",q[i].fi.fi,q[i].fi.se,q[i].se);}
}
void init() {q[1]=mp(mp(1,1),1);
}void work(int X,int Y) {int p=1;int x=1;init();For(k,Y) {//draw2();tian8(l,x);pair<pair<int,int> , int> now=q[head];Rep(i,3) Rep(j,3)  {if (i||j)q[++tail] = mp(mp(now.fi.fi +i*p , now.fi.se+j*p ), p  );}p*=3;}kuo2(l);Fork(i,head,tail) q[i].fi.fi=q[i].fi.fi*2-1,q[i].fi.se=q[i].fi.se*2-1,q[i].se*=2;//      kuo2(l);
//      Fork(i,head,tail) q[i].fi.fi=q[i].fi.fi*2-1,q[i].fi.se=q[i].fi.se*2-1,q[i].se*=2;For(k,X){       while (q[head].se<2&&head<=tail) ++head;if (head>tail) {tian3(l,x);q[++tail]=mp(mp(1,l/2+1),l/2);q[++tail]=mp(mp(l/2+1,1),l/2);q[++tail]=mp(mp(l/2+1,l/2+1),l/2);if (++k>X) break;//draw();}plus3(q[head].fi.fi,q[head].fi.se,q[head].se,x); ++head;}cout<<l<<endl;draw();
//  draw2();
}int main() {l=1; a[1][1]=1; int x=1;while(cin>>n) {if (n==2||n==5||n==3) {puts("Impossible");return 0;}else {puts("Possible");           int l=16*9;int x,y;{RepD(x,n+1) {if (n-1-3*x>=0 && (n-1-3*x)%8==0) {y=(n-1-3*x)/8;//      cout<<n<<' '<<x<<' '<<y<<endl;work(x,y);return 0;}}}if (n==6) {cout<<"3"<<endl;puts("1 1 2");puts("1 1 3");puts("6 5 4");return 0;   }if (n==8) {puts("4");puts("1 1 1 2");puts("1 1 1 8");puts("1 1 1 7");puts("3 4 5 6");return 0;   }if (n==11) {puts("8");puts("1 1 1 2 2 2 3 3");puts("1 1 1 2 2 2 3 3");puts("1 1 1 2 2 2 6 6");puts("4 4 4 5 5 5 6 6");puts("4 4 4 5 5 5 7 7");puts("4 4 4 5 5 5 7 7");puts("8 8 9 9 10 10 11 11");puts("8 8 9 9 10 10 11 11");return 0;   }if (n==14) {puts("9");puts("1 1 2 2 3 3 10 10 10");puts("1 1 2 2 3 3 10 10 10");puts("4 4 5 5 6 6 10 10 10");puts("4 4 5 5 6 6 11 11 11");puts("7 7 8 8 9 9 11 11 11");puts("7 7 8 8 9 9 11 11 11");puts("12 12 12 13 13 13 14 14 14");puts("12 12 12 13 13 13 14 14 14");puts("12 12 12 13 13 13 14 14 14");return 0;   }if (n==17) {puts("14");puts("1 1 1 1 1 1 2 2 2 2 2 2 5 5");puts("1 1 1 1 1 1 2 2 2 2 2 2 5 5");puts("1 1 1 1 1 1 2 2 2 2 2 2 7 7");puts("1 1 1 1 1 1 2 2 2 2 2 2 7 7");puts("1 1 1 1 1 1 2 2 2 2 2 2 9 9");puts("1 1 1 1 1 1 2 2 2 2 2 2 9 9");puts("3 3 3 3 3 3 4 4 4 4 4 4 11 11");puts("3 3 3 3 3 3 4 4 4 4 4 4 11 11");puts("3 3 3 3 3 3 4 4 4 4 4 4 13 13");puts("3 3 3 3 3 3 4 4 4 4 4 4 13 13");puts("3 3 3 3 3 3 4 4 4 4 4 4 15 15");puts("3 3 3 3 3 3 4 4 4 4 4 4 15 15");puts("6 6 8 8 10 10 12 12 14 14 16 16 17 17");puts("6 6 8 8 10 10 12 12 14 14 16 16 17 17");return 0;   }   }}return 0;
}

刚才那个做法太麻烦了,我们考虑3个初始状态,分别是
1,6(九宫格其中4个合并成1个),8(16宫格9个合并成一个),然后不停划十字,小数据手推


受6和8的影响,我们考虑2个正方形对角抵在一起,剩下全用1*1填的情况


这题可以胡乱构造出来真心。

The Kirakira Cycle

题意:已知fn(x)=∑ni=1(xmodi)f_n(x)=\sum_{i=1}^n(x \mod i) ,构成了一个x到fn(x)f_n(x)的映射,这定义了一张图,对于每个点x只有一条有向边从该点出发,指向fn(x)f_n(x),那么请问图中最大环的长度,只有n≤104n \le 10^4是已知的。

毫无规律,只好打表,问题是怎么打。
显然fn(x)−fn(x−1)=n−∑d<=nd|xdf_n(x)-f_n(x-1)=n-\sum_{d|x}^{d
而且最长环出现的数主要在[3/20(1+2+...+n),3/10(1+2+...+n)][3/20(1+2+...+n),3/10(1+2+...+n)]
于是根据这个对于n太大的情况打表,小数据暴力。
还有随机的作法:因为链很长,所以在那个区间找10个点当起点试试就行了。(没试过)

XOR Tree

一棵树n个节点,编号1..n,构造一颗树,使至少n+1对节点满足路径上节点编号的xor和为零。

小数据爆搜,大数据构造,
大致思路是构造太阳
举例:

Moscow SU Trinity Contest

Green Day

题意:给定k≤100k \le 100,求k个树,这些树节点数相同,且任意2图不出现下列情况:
存在两点(u,v),两棵树中路径(u,v)都经过不为u,v的点c
求任意解

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <cstdlib>
#include <queue>
#include <stack>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (500000000000LL)
#define F (100000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} int main() {int k=read();cout<<2*k<<endl;For(i,k) {Fork(j,i+1,k) cout<<i<<' '<<j<<endl << i+k <<' '<< j+k <<endl;Fork(j,1,i-1) cout<<i+k<<' '<<j<<endl << i<<' '<<j+k<<endl;cout<<i<<' '<<i+k<<endl;}return 0;
}

ICPC Camp 2016 几道神奇的构造打表题相关推荐

  1. 腾讯实习生面试2016两道面试题目?(知乎)

    腾讯实习生面试2016两道面试题目?修改 谢谢大神们高质量的回答,满满干货,excited ------------------------------------------------------ ...

  2. 【构造】CF12E Start of the season(神奇的构造)难度⭐⭐⭐

    CF12E Start of the season 题目描述 在伯兰的足球节开幕式中有一个奇怪的魔术秀.最有经验的魔术师会找一个n×nn×nn×n的矩阵(n为偶数).足球节没有这个魔术秀绝对不会开始. ...

  3. Kattis - icpccamp ICPC Camp(二分+贪心)

    题目链接:点击查看 题目大意:给出两种种类的数字分别 m1m_1m1​ 和 m2m_2m2​ 个,现在要求匹配 nnn 个不同种类的数字,每个数字只能使用一次,且两数之和不能超过 sss,输出任意两对 ...

  4. 可构造样式表 - 通过javascript来生成css的新方式

    可构造样式表是一种使用Shadow DOM进行创建和分发可重用样式的新方法. 使用Javascript来创建样式表是可能的.然而,这个过程在历史上一直是使用document.createElement ...

  5. 脱壳实践之手动构造输入表

    0x00 前言 对于脱壳后的程序往往不能直接运行,这是因为它们很多都没有重建输入表.当然用的od脱壳可能可以.重建输入表一般都是用专业软件比如ImportREC.但是对于逆向研究者来说会自己重讲输入表 ...

  6. NO.111 禅道导出数据做透视表,让你轻松做年终工作总结。

    为什么80%的码农都做不了架构师?>>>    年底了,很多公司都要求大家写年终工作总结.估计很多童鞋就开始犯愁了.年年写,来来去去总是那些模式,自己都觉得没意思. 今天,教大家一招 ...

  7. 从零写一个编译器(八):语义分析之构造符号表

    项目的完整代码在 C2j-Compiler 前言 在之前完成了描述符号表的数据结构,现在就可以正式构造符号表了.符号表的创建自然是要根据语法分析过程中走的,所以符号表的创建就在LRStateTable ...

  8. 计算机二级vf上机试题,2016年计算机二级《VF》上机题及答案

    2016年计算机二级<VF>上机题及答案 2016年3月计算机等级考试将于本周六开始,大家是否感受到了时间的紧迫感?为了帮助同学们顺利通过考试,下面百分网小编为大家搜索整理了关于计算机二级 ...

  9. 计算机二级高级应用考题,2016计算机二级MSOFFICE高级应用考试真题

    2016计算机二级MSOFFICE高级应用考试真题 离2016上半年的计算机等级考试只有一个多月了,为了帮助大家尽快考试过关,小编整理了计算机二级office考试题,希望能帮助到大家! (1)下列叙述 ...

最新文章

  1. Oracle数据库物理存储结构管理
  2. oracle技术之Oracle 跟踪事件(一)
  3. 《预训练周刊》第39期: 深度模型、提示学习
  4. 傅莹:AI 治理,需要借鉴「核管控」教训
  5. linux qcom LCD framwork
  6. 如何理解VMware内存资源管理
  7. Selenium自动化测试-3.元素定位(1)
  8. 用 Go 构建一个区块链 -- Part 1: 基本原型
  9. latex在行末出现百分号的作用
  10. 非线性光纤光学_深紫外非线性光学羟基硼酸盐的理论预言和实验验证
  11. SAR图像聚焦质量评价插件
  12. VFP_全面控制EXCEL
  13. 计算机发展前沿技术——医学领域的人工智能
  14. java程序报stream has already been operated upon or closed异常错误解决方案
  15. Java 获取某年的第一天和最后一天
  16. 我们需要培养职业化的工作习惯
  17. We Dont Kown ....
  18. 苹果icloud文件服务器,你真的会用苹果iCloud吗?这7个隐藏功能,你未必全知道...
  19. RNA-seq 详细教程:假设检验和多重检验(8)
  20. 阿里云购买域名到icp备案

热门文章

  1. 深圳市商务局关于深圳市2022年利用外资奖励计划(配套2021年省利用外资奖励项目)申报指南
  2. 智哪儿专访:小匠物联如何帮助颈部按摩仪品类完成智能化升级
  3. 一万年太久,只争朝夕。
  4. ubuntu时间差八小时
  5. html5视频播放器video player 选择
  6. 二维码扫码登录的背后 ...
  7. 判断应不应该离职,不能只看这两点
  8. Spring @autowire用法
  9. Filter-policy工具理论与实践
  10. 每日分享:可以将文字转换成语音的软件有哪些?