[WC2015]未来程序(提交答案)
sub1:ans=a*b%c,龟速乘即可。
#include <stdio.h>
#include <stdlib.h>
unsigned long long a, b, c, d;
unsigned long long mul(unsigned long long a,unsigned long long b)
{
unsigned long long x=;
while(b)
{
if(b&)x=(x+a)%c;
b>>=,a=(a+a)%c;
}
return x;
}
void _() {
scanf("%llu %llu %llu", &a, &b, &c);
d = mul(a,b);
printf("%llu\n", d);
} int main() {
freopen("program1.in","r",stdin);
freopen("program1.out","w",stdout);
_();
_();
_();
_();
_(); _();
_();
_();
_();
_();
}
生成代码
sub2:发现是一个递推式,每次转移如下:a'=a+2b+c,b'=a+b,c'=a,直接构造3*3的矩阵,进行矩乘即可。
#include<cstdio>
#include<cstring>
using namespace std;
long long n,p;
struct mat{
int a[][];
mat(){memset(a,,sizeof a);}
void init(){memset(a,,sizeof a);for(int i=;i<;i++)a[i][i]=;}
void prepare()
{
memset(a,,sizeof a);
a[][]=a[][]=a[][]=a[][]=a[][]=,a[][]=;
}
};
mat operator*(mat a,mat b)
{
mat c;
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
c.a[i][j]=(c.a[i][j]+1ll*a.a[i][k]*b.a[k][j])%p;
return c;
}
void _______() {
scanf("%lld %lld", &n, &p);
mat A,ret;
A.prepare(),ret.init();
while(n)
{
if(n&)ret=ret*A;
A=A*A,n>>=;
}
long long a=ret.a[][],b=ret.a[][],c=ret.a[][],d=((a-*b+c)%p+p)%p;
printf("%lld\n", d);
}
int main() {
freopen("program2.in","r",stdin);
freopen("program2.out","w",stdout);
_______();
_______();
_______();
_______();
_______();
_______();
_______();
_______();
_______();
_______();
return ;
}
生成代码
sub3:求Σik,其中k∈[0,4],手算求答案即可,这个没写代码,计算器算算即可。
答案
sub4:随机生成n*n(n<=5000)的0/1矩阵,第一问求值为1的格子选2个进行排列的方案数,显然就是x*(x-1)(x为值为1的格子数);第二问是求对于每个值为1的格子,距离它最近的值为0的格子的距离,输出距离和,显然可以bfs多元最短路搜索,复杂度可以O(Tn2),大约5~10s能跑出答案
#include <iostream>
using namespace std;
const int N = , inf = 0x3F3F3F3F;
int n, m, type,dx[]={,,,-},dy[]={,-,,};
bool mp[N + ][N + ],vis[N+][N+];
int qx[N*N+],qy[N*N+],d[N+][N+];
long long ans;
int seed;
int next_rand(){
static const int P = , Q = , R = ;
return seed = ((long long)Q * seed % P * seed + R) % P;
}
long long count1()
{
ans = 0LL;
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
if(mp[i][j])ans++;
return ans*(ans-);
}
long long count2()
{
ans = 0LL;
int qs=,qe=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(mp[i][j])vis[i][j]=;
else vis[i][j]=,d[i][j]=,qx[qe]=i,qy[qe++]=j;
while(qs<qe)
{
int x=qx[qs],y=qy[qs++];
for(int i=;i<;i++)
{
int u=x+dx[i],v=y+dy[i];
if(u<||u>=n||v<||v>=m||vis[u][v])continue;
vis[u][v]=,d[u][v]=d[x][y]+,qx[qe]=u,qy[qe++]=v;
ans+=d[u][v];
}
}
return ans;
}
int main(){
freopen("program4.in","r",stdin);
freopen("program4.out","w",stdout);
cin >> seed;
for(int i = ; i < ; i++){
cin >> n >> m >> type;
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
mp[i][j] = bool((next_rand() % ) > );
cout << (type == ? count2() : count1()) <<endl;
}
return ;
}
生成代码
sub5:随机生成n*n(n<=5000)的0/1矩阵,求全1矩阵个数。这题的简化版:https://www.cnblogs.com/hfctf0210/p/10852851.html
#include <iostream> const int N = ;
int n, m,c[N][N],st[N];
bool data[N][N];
long long sum[N];
int seed;
int next_rand(){
static const int P = , Q = , R = ;
return seed = ((long long)Q * seed % P * seed + R) % P;
} void generate_input(){
std::cin >> n >> m;
for(int i = ; i <=n; i++)
for(int j =; j <=m; j++)
data[i][j] = bool((next_rand() % ) > );
}
long long count3(){
long long ret=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
c[i][j]=data[i][j]?c[i-][j]+:;
int top;
for(int i=;i<=n;i++)
{
st[]=top=;
for(int j=;j<=n;j++)
if(!c[i][j])st[]=j,top=;
else{
while(top&&c[i][j]<=c[i][st[top]])top--;
st[++top]=j,sum[top]=sum[top-]+1ll*(j-st[top-])*c[i][j];
ret+=sum[top];
}
}
return ret;
} int main(){
freopen("program5.in","r",stdin);
freopen("program5.out","w",stdout);
std::cin >> seed;
for(int i = ; i < ; i++){
generate_input();
std::cout << count3() << std::endl;
} return ;
}
生成代码
sub6:发现式子还有自然溢出,快速幂/矩阵类显然不行,想到floyd套圈,学习笔记链接:https://www.cnblogs.com/hfctf0210/p/10725670.html,不过要跑300~400s
#include<iostream>
using namespace std;
typedef unsigned long long ull;
ull T,n,a,b,c;
ull s,t,tim,tn,tm;
int main()
{
freopen("program6.in","r",stdin);
freopen("program6.out","w",stdout);
int T=;
while(T--)
{
cin>>n>>a>>b>>c;
s=t=tn=,tm=;
while()
{
t=(a*t*t+b)%c;
tn++;
if(s==t)break;
if(tn==tm)tn=,tm<<=,s=t;
}
s=t=tim=;
while(tim<tn)t=(a*t*t+b)%c,tim++;
tim=;
while(s!=t)s=(a*s*s+b)%c,t=(a*t*t+b)%c,tim++;
tm=(n-tim)%tn+;
tim=;
while(tim<=tm)s=(a*s*s+b)%c,tim++;
cout<<s<<endl;
}
}
生成代码
sub8:把a~g当成7个点,化成图形,发现10张图需要枚举的变量均不超过2个,由于n%mod很小(大约1e6级别),对于需要枚举不超过1个的8张图,直接枚举即可,剩下2张图直接手推/枚举打表即可。
答案
sub7/9/10:咕了,太菜了不会
[WC2015]未来程序(提交答案)的更多相关文章
- UOJ#73. 【WC2015】未来程序 提交答案题
原文链接www.cnblogs.com/zhouzhendong/p/UOJ73.html 前言 纯属理性愉悦. 题解 Subtask1 发现就是求 $a \times b \mod c $ . 写个 ...
- 【洛谷4920】[WC2015] 未来程序(提答题)
点此看题面 大致题意: 把\(10\)个点的暴力代码和输入数据都给你,让你求出输出数据. 子任务\(1\) 第一个子任务自然是拿来送分用的... 容易发现就是一个快速乘的过程啊. 代码如下: #inc ...
- uoj#73 【WC2015】未来程序
在 2047 年,第 64 届全国青少年信息学奥林匹克冬令营前夕,B君找到了 2015 年,第 32 届冬令营的题目来练习. 他打开了第三题 “未来程序” 这道题目: 本题是一道提交答案题,一共 10 ...
- Uoj 73 未来程序
Uoj 73 未来程序 神仙提答. Subtask 1 仔细阅读,发现是要计算 \(a*b\ \%\ c\).用龟速乘或者 \(python\) 直接算. Subtask 2 仔细阅读并手算一下,发现 ...
- 浅谈OI中的提交答案
在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...
- 怎样通过Java程序提交yarn的mapreduce计算任务
因为项目需求,须要通过Java程序提交Yarn的MapReduce的计算任务.与一般的通过Jar包提交MapReduce任务不同,通过程序提交MapReduce任务须要有点小变动.详见下面代码. 下面 ...
- 如何A掉未来程序改
话说有这样一道神题:[集训队互测2015]未来程序·改. 大意是要求写一个简单的C++解释器!这里去掉了C++的许多特性,连简单的break和continue都没有了! 话说NOI被屠了之后,一时心血 ...
- 初次stack-overflow 提交答案
初次在stack-overflow上面提交答案,首先编辑器非常好用,语法检查都有, 还有付费版的,更高级,更好用,nice. 付费版:https://www.grammarly.com/upgrade ...
- Spark集群模式&Spark程序提交
Spark集群模式&Spark程序提交 1. 集群管理器 Spark当前支持三种集群管理方式 Standalone-Spark自带的一种集群管理方式,易于构建集群. Apache Mesos- ...
随机推荐
- [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome
Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...
- 二、在SAP中创建一个程序
一.我们来到SE38 二.添加一个程序的名字,需要以Y或者Z开头,点击创建就可以了 三.我们输入hello Sap,然后选择可执行程序,然后保存 四.创建对象目录时,可以选择把这个加入到包中,或者选择 ...
- Excel----考勤表制作自动更新日期
起初效果 1. 我们首先输入年月日,如图 选择日期 按`ctrl+1` 来调出下图: 2. 数据填充 3.设置星期 点击1下面的单元格
- POJ 1562:Oil Deposits
Oil Deposits Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14462 Accepted: 7875 Des ...
- 福州大学2020年春软工实践W班第一次作业
作业描述 这个作业属于哪个课程 福州大学2020年春软工实践W班 这个作业要求在哪里 寒假作业(1/2) 这个作业的目标 建立博客.回顾,我的初心.当下和未来.学习路线 作业正文 福州大学2020年春 ...
- 实用的VMware虚拟机使用技巧十一例
同时安装多个操作系统的方法有很多,例如Linux Grub引导.WindowsNT OS Loader引导.System Commander引导.Partition Magic改变激活分区等,但总是比 ...
- 软件设计之基于Java的连连看小游戏(三)——所有功能的实现
新年快乐!期末接二连三的考试实在太忙了忘记连连看没有更新完,今天想要学习生信时才发现.所以这次直接把连连看所有功能全部放上. 在传统的连连看的基础上,我增加了上传头像的功能,即可以自行上传图片作为游戏 ...
- JKS not Found
近期使用Spring Boot开发微信验证的时候, 在获取token时,Idea老是提示Jks not found,网上找资料,都说是SSL的问题 实际解决方法: 重装JDK,将JDK重装之后,运行正 ...
- YouTube推出慈善组合工具,能引国内视频网站跟风吗?
互联网的出现不仅仅让大众的工作和生活更便利,更深度改变着传统事物的形态,让其被更多人广泛地认知并接触到.如,原本在线下通过彩页.手册.横幅等进行宣传.募捐的慈善,就通过互联网展现出更为强大的影响力.而 ...
- 使用idea出现的错误
错误:打开maven项目时出现"程序包 com.sun.org.apache.xpath.internal 不可见 "的错误 这个问题出现的原因是: jdk版本的问题.可能是因为有 ...