把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

2020.11.20NOIP模拟T1 简单题

题目链接

题意

解析

我就是傻瓜本傻,最简单的一道题,一来看错题目,扫了一眼以为是求最后的A,B,C,除了暴力之外想不到任何做法,还以为有循环之类的东西(实际上根本没有),然后就放弃了。

后面做完T2再看这道题,发现只用求C,而且发现无论怎样操作,三个数的和都不变,所以很快列出了以下式子:

C={2Csum,sumC<=C2C,sumC>C

然后我似乎是对那个什么循环有执念似的,非觉得可以找循环节,然而并不能证明循环节很短哦(说实话我考试想到了这个,但是没有在意这个证明,毕竟我不会证的结论海了去了),所以复杂度可能会飙很高,然后光荣地T掉。

正确的打开方式是:你仔细观察那个式子,(把条件移项移成2C>=sum会明显一点)你发现这玩意儿的本质是2×C%sum,所以就把两种操作统一起来了,做k次操作最后的答案就是2k×C%sum


►Code View

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define LL long long
#define N 2000005
#define INF 0x3f3f3f3f
LL rd()
{
	LL x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48); c=getchar();}
	return f*x;
}
LL MOD;
LL ksm(LL a,LL b)
{
	LL res=1ll;
	while(b)
	{
		if(b&1) res=res*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
	return res;
}
int main()
{
	freopen("easy.in","r",stdin);
	freopen("easy.out","w",stdout);
	int T=rd();
	while(T--)
	{
		LL a=rd(),b=rd(),c=rd(),k=rd();
		MOD=a+b+c;
		LL ans=ksm(2,k)*c%MOD;
		printf("%lld\n",ans);
	}
    return 0;
}
/*#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define LL long long
#define N 2000005
#define INF 0x3f3f3f3f
LL rd()
{
	LL x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48); c=getchar();}
	return f*x;
}
map<LL,int> vis;//上一次出现的位置 
LL ans[N];
int main()
{
	freopen("easy.in","r",stdin);
	freopen("easy.out","w",stdout);
	int T=rd();
	while(T--)
	{
		LL a=rd(),b=rd(),c=rd(),k=rd(),len;
		LL sum=a+b+c;
		vis.clear();
		vis[c]=0;
		ans[0]=c;
		int pos=0;
		while(1)
		{
			if(sum-c<=c) c=2*c-sum;
			else c=2*c;
			if(vis[c])
			{
				len=pos-vis[c]+1;
				break;
			}
			vis[c]=++pos;
			ans[pos]=c;
		}
		if(k<=vis[c]-1)
		{
			printf("%lld\n",ans[k]);
			continue;
		}
		k-=(vis[c]-1);
		int r=k%len;
		if(r==0) r=len;
		printf("%lld\n",ans[vis[c]+r-1]);
	}
    return 0;
}*/
posted @   Starlight_Glimmer  阅读(194)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示