uoj#73 【WC2015】未来程序
在 2047 年,第 64 届全国青少年信息学奥林匹克冬令营前夕,B君找到了 2015 年,第 32 届冬令营的题目来练习。
他打开了第三题 “未来程序” 这道题目:
-
本题是一道提交答案题,一共 10 个测试点。
对于每个测试点,你会得到一段程序的源代码和这段程序的输入。你要运行这个程序,并保存这个程序的输出。
遗憾的是这些程序都效率极其地下,无法在比赛的 5 个小时内得到输出。
B君想了一下,决定用 2047 年的计算机来试着运行这个题目,他找到了 2015 年的编译器,并很快得到了结果……
这时B君从梦中惊醒,发现自己居然在第 32 届冬令营赛场上。之前的一切只是南柯一梦,而自己正需要解决“未来程序”这道题目。
然而B君已经记不清梦中的程序运行的结果了,他试图再次运行这些程序。但是他发现计算机性能比梦里的差多了,程序确实都无法在 55 小时内得到结果。
他需要你的帮助,来得到那些梦中的结果。
本题是一道提交答案题,一共有 10 个测试点。
对于每个测试点,你会得到一段程序的源代码和这段程序的输入。你要运行这个程序,并保存这个程序的输出。
遗憾的是这些程序效率都极其低下,无法在比赛的 5 小时内得到输出。
你需要帮助B君得到这些程序的输出。
输入格式
本题一共有 10 个测试点,编号为 1~10。以下用 “*” 表示测试点编号。
对于每个测试点有 4 个文件,分别是 program*.cpp 文件,program*.c 文件,program*.pas 文件,program*.in 文件。
你需要用自己的方法,得到以 program*.in 作为输入,编译运行 program*.{cpp, c, pas} 的输出。
你只需要在 3 种语言的代码中选择 1 种来解这道题目。这 3 种语言的代码在语意上是类似的,运行结果是相同的。
输出格式
对于给出的 10 个测试点,你需要将程序的输出分别保存在 program*.out 中。
特别地,我们保证每个测试点一定会输出恰好 10 行。
评分方法
每个测试点单独评分。
如果你的一个输出文件超过了 4KB,或某一行超过了 400 个字符,该测试点得 0 分。
否则对于每行单独评分,如果该行与标准答案相同,可以得 1 分。
如果你的输出不足 10 行,我们会在你的输出末尾添加空行补齐 10 行。
如果你的输出超过 10 行,我们会取出你的前 10 行作为输出。
样例
请下载输入数据。样例输入见 example.{in,cpp,c,pas},样例输出见 example.ans。
恶心提答题。。真的无语。
program1:容易看出求a*b%p,要高精度,python即可。
program1.out: 11239440904485 7551029211890 20677492996370 592966462292420 69231182718627 479525534330380 544015996901435 214227311823605 73749675429767 239498441843796
program2:经过一次转移,a=a+2b+c,b=a+b,c=a,那么我们可以构造3*3的矩阵,直接矩阵快速幂即可。
1 //It is made by wfj_2048~ 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cstdio> 7 #include <vector> 8 #include <cmath> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 #define inf (1<<30) 14 #define il inline 15 #define RG register 16 #define ll long long 17 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) 18 19 using namespace std; 20 21 struct data{ ll a[4][4]; }ans,c; 22 23 ll n,p; 24 25 il ll gi(){ 26 RG ll x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); 27 if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; 28 } 29 30 il data mul(RG data a,RG data b,RG ll p){ 31 RG data c; memset(c.a,0,sizeof(c.a)); 32 for (RG ll i=1;i<=3;++i) 33 for (RG ll j=1;j<=3;++j) 34 for (RG ll k=1;k<=3;++k){ 35 c.a[i][j]+=a.a[i][k]*b.a[k][j]%p; 36 c.a[i][j]%=p; 37 } 38 return c; 39 } 40 41 il data qpow(RG data a,RG ll b,RG ll p){ 42 RG data c=a; b--; 43 while (b){ 44 if (b&1) c=mul(c,a,p); 45 a=mul(a,a,p),b>>=1; 46 } 47 return c; 48 } 49 50 il void work(RG ll n,RG ll p){ 51 memset(ans.a,0,sizeof(ans.a)),memset(c.a,0,sizeof(c.a)); 52 ans.a[1][1]=1,c.a[1][1]=c.a[1][2]=c.a[1][3]=c.a[2][2]=c.a[3][1]=1,c.a[2][1]=2; 53 RG data b=qpow(c,n,p); ans=mul(ans,b,p); 54 printf("%lld\n",(ans.a[1][1]-2*ans.a[1][2]+ans.a[1][3]+2*p)%p); return; 55 } 56 57 int main(){ 58 File("program2"); 59 for (RG int i=1;i<=10;++i){ 60 n=gi(),p=gi(); 61 work(n,p); 62 } 63 return 0; 64 } 65 66 program2.out: 67 0 68 1 69 96 70 64 71 2503 72 2523 73 4452160 74 557586868 75 959316082 76 1107500137
program3:幂和公式,然而我只会前6个点,不过6分挺好的。。(我的程序求4次方是WA的,我也不知道为什么。。)
1 //It is made by wfj_2048~ 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cstdio> 7 #include <vector> 8 #include <cmath> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 #define inf (1<<30) 14 #define il inline 15 #define RG register 16 #define ll unsigned long long 17 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) 18 19 using namespace std; 20 21 ll n,s0,s1,s2,s3,s4; 22 23 il int gi(){ 24 RG int x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); 25 if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; 26 } 27 28 il void work(){ 29 scanf("%llu",&n); 30 s0=n+1; 31 s1=(1+n)*n/2; 32 s2=n*(n+1)*(2*n+1)/6; 33 s3=n*(n+1)/2*n*(n+1)/2; 34 s4=(6*n*n*n*n*n+15*n*n*n*n+10*n*n*n-n)/30; 35 printf("%llu\n%llu\n%llu\n%llu\n%llu\n%llu\n%llu\n%llu\n%llu\n%llu\n",s0,s0,s1,s1,s2,s2,s3,s3,s4,s4); 36 return; 37 } 38 39 int main(){ 40 File("program3"); 41 work(); 42 return 0; 43 } 44 45 program3.out: 46 1000000000000001 47 1000000000000001 48 2538972135152631808 49 2538972135152631808 50 2806098670314569728 51 2806098670314569728 52 6570342264898322432 53 6570342264898322432 54 10067259324320137216 55 10067259324320137216
program9:破译密码。。不会搞,只能根据提示xjb猜。。
program9.out: 1984 123456 chenlijie $_$ we hold these truths to be selfevident
其他的还没做,到时候再玩吧。。