处女座和小姐姐(二)

2024-06-17 21:38
文章标签 小姐姐 处女座

本文主要是介绍处女座和小姐姐(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目描述】

课上处女座成功将纸条传给了小姐姐,约下午和小姐姐一起逛街。他们坐在公交车上一起欣赏窗外的广告牌,每一个广告牌都有一个编号,而处女座的视野范围是有限的,每次只能看到连续的p个广告牌。由于处女座是数学大师,他用O(1)的时间算出来了他看到的广告牌编号的积mod P的值并记录了下来,直到坐车到了商场。

商场里有定制手环的地方,他可以定制一个长度为k的手环,但是选号是收费的,而处女座把家教挣来的钱都用于外出打比赛了,于是他决定自己挑号。

他把之前路上记下来数字按先从左往右,再从上到下的顺序排成一个n*m的矩阵,他想从中选出一条长度为k的路径,使得路径上的数在mod k的意义上各不相同(每个点只和他的上下左右相邻),从而作为他选的号码。

现在处女座想知道,他有多少条路径可以选择(不忽视顺序,(2,2)->(2,1)和(2,1)->(2,2)会被视为两条路径)。

【输入描述】

输入数据共包括两行,第一行包括四个整数n,m,p,P,k,其中p为处女座一次能看到的连续广告牌的数量,其他字母含义如描述所示。

第二行包括四个整数a0,x,y,z,对于每个广告牌而言,他的编号是ai=x∗ai−12+y∗ai−1+z。广告牌从a1开始到an∗m+p−1为止。

1≤n,m≤20
1≤k≤min(20,n∗m)
1≤p≤106
1≤A0,P,X,Y,Z≤1,000,000,000

【输出描述】

一个整数,表示可以选择的路径数量。

【样例】

示例1

输入
2 2 1 2 2
1 0 1 1
输出
4
说明
a1=2,a2=3,a3=4,a4=5 

所以2*2的矩阵是:

0 1

0 1

因此可行方案有(1,1)->(1,2),(1,2)->(1,1),(2,1)->(2,2),(2,2)->(2,1)共4种

思路:

问题可以分成两个子问题,首先是求一个数组连续 p 个数 mod p 的乘积,其次是找出长度为 k 的符合条件的链的个数

对于第一个问题,可以将序列按照长度 m 进行分段,每段分别计算前缀和后缀乘积,这样任意位置的答案可以看成前段的后缀与后短的乘积拼出

对于第二个问题,可以用 dfs 进行搜索,但由于 (400*3)^20 显然会 TLE,因此可进行双向优化,枚举起点然后双向 dfs,一次向两边进行搜索,故而时间复杂度可降到 400*(2*3)^10,此外,可以使用状压的方式来记录状态

【源代码】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-6
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define N 2000001
#define LL long long
using namespace std;
LL n,m,p,P,k;
LL a[N],b[N],temp[N];
LL X,Y,Z;
LL res;
LL G[101][101];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void dfs(int x,int y,int cnt,int ans,int sum,bool flag)
{if(cnt==sum){if(!flag)temp[ans>>1]++;if(flag)res+=temp[(((1<<(k+1))-1)^ans)>>1];return;}for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(ans&(1<<G[nx][ny]))continue;dfs(nx,ny,cnt+1,ans|(1<<G[nx][ny]),sum,flag);}
}
int main(){scanf("%lld%lld%lld%lld%lld",&n,&m,&p,&P,&k);scanf("%lld%lld%lld%lld",&a[0],&X,&Y,&Z);for(int i=1;i<=n*m+p-1;i++)//前缀a[i]=(a[i-1]*a[i-1]%P * X%P + a[i-1]*Y%P + Z )%P;int cnt=0;//标号int pos=0;//位置for(int i=p;i<=n*m+p-1;i++){//后缀res=res*a[i]%P;if(i-p+1>pos){res=1;pos=i;b[i]=a[i];for(int j=i-1;j>=i-p+1;j--)b[j]=b[j+1]*a[j]%P;}temp[++cnt]=(LL)b[i-p+1]*res%P;}int cur=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)G[i][j]=temp[++cur]%k+1;res=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){memset(temp,0,sizeof(temp));//双向优化搜索dfs(i,j,1,1|(1<<G[i][j]),k/2,false);dfs(i,j,1,1,k/2+k%2+1,true);}}if(n==1&&m==1)res=1;printf("%lld\n",res);return 0;
}

 

这篇关于处女座和小姐姐(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070543

相关文章

处女座和小姐姐

【题目描述】 既然昨天晚上处女座已经训练了,明天才要交作业,那今天就是平淡无奇要上课的一天了。 然而处女座也想自己的小姐姐了,可是这节课是老师安排座位,处女座坐在(1,1),而小姐姐坐在(n,m)。他们之间只能通过传纸条的方式来交流感情。对于处女座而言,他上课不想过度分心,因此并不想传纸条,只在那里趁机折千纸鹤。 老师上课喜欢用"开火车"的方式让大家轮流回答问题,显然处女座作为(1,1)位,会被

处女座与重修费

【题目描述】 期末考试结束了,处女座发现很多人挂了大物,只能等着第二年重修,还要交400元的重修费。处女座突然想起有个学长和他讲过,如果学校哪一年缺钱了,那一年的大物试卷就会特别难。现在处女座有了所有人的成绩,处女座想知道如果所有挂科的人都在第二年重修,学校能赚多少重修费? 挂科是指一门课的分数小于60分。 【输入描述】 第一行一个整数n,表示考试的人数。 第二行n个整数,表示每个人的成绩。 1

处女座的测验(二)

【题目描述】 现在处女座顺利的完成了测验,处女座想要知道知道自己输出的结果是否正确。他希望知道自己有自己输出的数中有多少对是不满足要求的。 更具体的,处女座想知道下面程序段的答案 int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];int ans=0;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++

处女座的百日理财计划

【题目描述】 处女座为了有更充足的资金和小姐姐一起玩耍,于是就放"高利贷"给小姐姐,一般小姐姐一周就会还钱,而处女座只要10%的利率,这样算下来,如果可以利滚利的话,1元钱经过1年(360天)可以变成51.43元呢,想起来就非常美滋滋哦! 不过总是借钱给小姐姐并不是长远之策,处女座开始了自己的百日理财计划。处女座在第一天的早上可以获得1000元的启动资金。之后在每天的早上,他会回收借给别人的到期

处女座的比赛

【题目描述】 经过了训练、资金等多方面的准备,处女座终于可以去比赛了!比赛采用codeforces赛制,也就意味着可以插人。现在有一道字符串的题目,处女座在room里看到一个用hash做的,于是决定把它hack掉。这个人的核心代码如下: const int mod=9983;mul[0]=p;mul[1]=q;mul[2]=r;for (int i=0;i<26;i++)in_dex[i

处女座的训练

【题目描述】 处女座靠着自己的家教本领赚够了去比赛的钱,于是开启了疯狂训练。在每个夜深人静第二天不收作业的夜晚,他都会开始刷题。 "今日又是一个刷题的夜晚。"他挑选了n道题开始刷,而题太多,刷不掉,理还乱(呜呜)、自己没有解决的题目每分钟都会给他带来 bi 的疲倦值,而解决每一道题目都需要花费 ai 分钟的时间。 当然,处女座一般都是考虑清楚了再写题的,所以他在写题的时候都会精神抖擞,也就是说,

处女座的签到题

【题目描述】 平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多少? 【输入描述】 第一行T,表示样例的个数。 对于每一组样例,第一行两个整数n和k, 接下来n行,每行两个整数x,y表示点的坐标 T<=80 3<=n<=100 -10^9<=x,y<=10^9 对于每一组样例,保证任意两点不重合,且能构成的三角形的个数不小于k 【输出描述】 对于每一组样例,输出第k大三角形的面积,

处女座点名

【题目描述】 处女座觉得自己手上的经费可能不太够,于是决定给牛逼学生们带家教。 一天他去上课用自己的火眼金睛感觉教室里有一个学生没有来,于是他就叫学生们报出自己的学号。 已知这个班上的学号是从1开始连续编号的,处女座告诉你这个班上有多少人,想问问你到底是谁没有来。 【输入描述】 输入数据共两行,第一行为一个整数N,表示班上的学生数量。 第二行为一行N-1个整数,表示已经来的学生的学号,按升序给出

处女座与宝藏

【题目描述】 处女座进行了一次探险,发现了一批宝藏。如果他获得这批宝藏,那么他一辈子都不需要工作了。但是处女座遇到了一个难题。 宝藏被装在n个宝箱里,宝箱编号为1,2,…,n,只有所有宝箱在某一时间被打开,处女座才能获得宝藏。有m个开关,每个开关控制k个宝箱,如果按下一个开关,那么这k个宝箱的开关状态都会发生改变(从开启变成关闭,从关闭变成开启),处女座想知道他能否获得这批宝藏。 【输入描述】

处女座与cf

【题目描述】 众所周知,处女座经常通过打cf来调节自己的心情。今天处女座又参加了一场cf的比赛,他知道了所有的提交记录,他想知道自己的得分和排在第几名。你知道处女座的cf账号是cnz Codeforces规则如下: 1.比赛一共2小时 2.比赛有5题,A题500分,B题1000分,C题1500分,D题2000分,E题2500分。 3.得分规则如下: 在第 0 分钟完成某一题可以得到全部的分数,每