UVALIVE4595

这题思路蛮巧妙的……中午过了下午再看觉得自己能想到这方法真神奇……

题意是说,给一个R*C的方格,里面从左上到右下填满了1到R*C的数。另外给了一个(R-1)*(C-1)的操作矩阵。现在进行N次操作,每次操作中,记录当前位置的数,进行对应位置的操作,当前位置移动到右侧一格或直接换行(只在(R-1)*(C-1)的格子中运动)。问最后每个数被记录的次数。

因为N很大,暴力枚举显然不可行。但注意到,事实上每遍历一次所有格子,每个格子中的数被转移到新的格子的规律是固定的(也就是说每次操作中,(I,J)的数一定被移动到对应的(PI,PJ),与具体的次数无关)。这样,我们首先暴力求出一次遍历后对应的置换,求出所有的循环节,同时记录各个格子(不是数,因为每次遍历后格子中的数会有不同)在这一次遍历中被记录的次数。我们先求出N除以(R-1)*(C-1)的商和余数,表示遍历的次数和剩余的次数。接着遍历所有的循环节,我们可以先求出这个循环节总共被完整遍历了多少次,再加上没有完整遍历的部分即可,同时保存最后一次时各个格子里的数分别是多少。最后,再暴力算完剩余的次数即可。

说可能说不是很清楚,看程序吧……

#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;

char nu[105],mo[305][305];
int n,m,res[100005],rt[100005],nl;
int a[305][305],b[305][305],bt[305][305];
int vis[100005],pn=0,nut[105],nutt[105];
vector<int> E[100005];

ll rema[90005],sh[90005];

int main()
{
	int i,j,l,I=0;
	while(scanf("%d %d %s",&n,&m,nu)!=EOF)
	{
		memset(res,0,sizeof(res));
		memset(rt,0,sizeof(rt));
		for(i=0;i<n-1;i++) scanf("%s",mo[i]);
		for(i=0;i<n*m;i++) bt[i/m][i%m]=b[i/m][i%m]=a[i/m][i%m]=i+1;
		for(i=0;i<n-1;i++)
			for(j=0;j<m-1;j++)
			{
				rt[b[i][j]]++;
				if(mo[i][j]=='L') {int te=b[i][j];b[i][j]=b[i][j+1];b[i][j+1]=b[i+1][j+1];b[i+1][j+1]=b[i+1][j];b[i+1][j]=te;}
				if(mo[i][j]=='R') {int te=b[i][j];b[i][j]=b[i+1][j];b[i+1][j]=b[i+1][j+1];b[i+1][j+1]=b[i][j+1];b[i][j+1]=te;}
			}
		for(i=0;i<=n*m;i++) E[i].clear();memset(vis,0,sizeof(vis));pn=0;
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
			{
				int te=i*m+j+1;
				if(vis[te]) continue;
				E[pn].push_back(te);
				while(b[(te-1)/m][(te-1)%m]!=i*m+j+1)
				{
					te=b[(te-1)/m][(te-1)%m];
					vis[te]=1;
					E[pn].push_back(te);
				}
				++pn;
			}
		//for(i=0;i<pn;i++,cout<<endl)	for(j=0;j<E[i].size();j++) cout<<E[i][j]<<" ";
		nl=strlen(nu);
		for(i=0;i<nl;i++) nut[i]=nu[nl-1-i]-'0';
		ll rem=0,css=(n-1)*(m-1);
		for(j=nl-1;j>=0;j--)
		{
			rem=rem*10+nut[j];
			nut[j]=rem/css;
			rem%=css;
		}
		while(nl>1) if(!nut[nl-1])--nl;else break;
		memset(rema,-1,sizeof(rema));
		for(i=0;i<pn;i++)
		{
			ll cs=E[i].size();
			if(rema[cs]>=0) continue;
			rema[cs]=0;
			memset(nutt,0,sizeof(nutt));
			for(j=nl-1;j>=0;j--)
			{
				rema[cs]=rema[cs]*10+nut[j];
				nutt[j]=rema[cs]/cs;
				rema[cs]%=cs;
			}
			sh[cs]=0;
			for(j=min(4,nl-1);j>=0;j--) sh[cs]=sh[cs]*10+nutt[j];
		}
		for(i=0;i<pn;i++)
		{
			memset(nutt,0,sizeof(nutt));
			ll cs=E[i].size();
			ll tet=rema[cs];
			ll tett=sh[cs],sut=0;
			for(j=0;j<cs;j++) sut=(sut+rt[E[i][j]])%100000;
			for(j=0;j<cs;j++) res[E[i][j]]=sut*tett%100000;
			ll tettt=0;
			for(j=0;j<tet;j++) tettt=(tettt+rt[E[i][(cs-j)%cs]])%100000;
			for(l=0;l<cs;l++)
			{
				res[E[i][l]]=(res[E[i][l]]+tettt)%100000;
				tettt=(tettt+rt[E[i][(l+1)%cs]]-rt[E[i][(l-tet+1+cs)%cs]]+100000)%100000;
			}
			/*
			for(j=0;j<tet;j++)
			{
				for(l=0;l<cs;l++)
				{
					res[E[i][l]]=(res[E[i][l]]+rt[E[i][(l-j+cs)%cs]])%100000;
				}
			}
			*/
			for(j=0;j<cs;j++) {bt[(E[i][j]-1)/m][(E[i][j]-1)%m]=a[(E[i][(j+tet)%cs]-1)/m][(E[i][(j+tet)%cs]-1)%m];}
		}
		for(l=0;l<rem;l++)
		{
			i=l/(m-1);j=l%(m-1);
			res[bt[i][j]]++;res[bt[i][j]]%=100000;
			if(mo[i][j]=='L') {int te=bt[i][j];bt[i][j]=bt[i][j+1];bt[i][j+1]=bt[i+1][j+1];bt[i+1][j+1]=bt[i+1][j];bt[i+1][j]=te;}
			if(mo[i][j]=='R') {int te=bt[i][j];bt[i][j]=bt[i+1][j];bt[i+1][j]=bt[i+1][j+1];bt[i+1][j+1]=bt[i][j+1];bt[i][j+1]=te;}
		}
		if(I++) printf("\n");
		for(i=1;i<=n*m;i++) printf("%d\n",res[i]);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
综合小区管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、车位管理、车位分配管理、出入管理、字典管理、房屋管理、物业费缴纳管理、公告管理、物业人员投诉管理、我的私信管理、物业人员管理、用户管理、管理员管理。用户的功能包括管理部门以及部门岗位信息,管理招聘信息,培训信息,薪资信息等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 综合小区管理系统管理系统可以提高综合小区管理系统信息管理问题的解决效率,优化综合小区管理系统信息处理流程,保证综合小区管理系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理综合小区管理系统信息,包括出入管理,报修管理,报修管理,物业费缴纳等,可以管理操作员。 出入管理界面,管理员在出入管理界面中可以对界面中显示,可以对招聘信息的招聘状态进行查看,可以添加新的招聘信息等。报修管理界面,管理员在报修管理界面中查看奖罚种类信息,奖罚描述信息,新增奖惩信息等。车位管理界面,管理员在车位管理界面中新增。公告管理界面,管理员在公告管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值