首页 > 其他分享 >CF1804C Pull Your Luck 题解

CF1804C Pull Your Luck 题解

时间:2024-04-10 17:58:52浏览次数:27  
标签:Pull frac bmod 题解 ll times now CF1804C displaystyle

题面

翻译清晰,这里就不吐槽了。

根据轮盘转动的方法,可以看出这是一个简单的高斯求和

因为这是一个轮盘,在轮盘中转动了 \(now\) 个格子与转动了 \(now \bmod n\) 所到达的格子是一样的(这就没必要证明了吧),因此我们很容易就能得到一个最朴素的代码:

	cin >> T;
	while(T--)
	{
		cin >> n >> x >> p;
		ll flag = 0;
		fr(i , 1 , p)
		{
			ll now = (1 + i) * i / 2;
			if((x + now) % n == 0)
			{
				printf("Yes\n");
				flag = 1;
				break;
			}
		}
		if(!flag)
		{
			printf("No\n");
		}
	}

然后非常愉快地在第二个点超时。

回看数据才发现 \(p \le 10^9\)……

我们要解决的其实就是 \(p\) 的上界,下界没得商量,从 \(1\) 开始。

不妨多出几组小数据模拟一下就会发现,\(p\) 的上界与 \(n\) 貌似有点关系,当 \(p\) 超过某个值时,所能到达的格子便会开始陷入循环,只要找出这个值就解决问题了。

先列一个长度大于 \(n\) 的三倍的序列:

\(\displaystyle \frac{1 \times (1+1)}{2}\),
\(\displaystyle \frac{2 \times (2+1)}{2}\)
……
\(\displaystyle \frac{n \times (n+1)}{2}\),
……
\(\displaystyle \frac{2n \times (2n+1)}{2}\),
……
\(\displaystyle \frac{3n \times (3n+1)}{2}\)……

这个序列其实就表示移动的步数,表示最终位置需要化简并对 \(n\) 取模,得到通项公项:

\(\displaystyle \frac{hi \times (hi+1)}{2} \bmod n\),其中 \(1 \le i \le n\),\(h \in N\)。

用来表示的字母没有特殊意义,不要追问 doge。

接下来只要找到最小的 \(h\) 满足 \(\displaystyle \frac{hi \times (hi+1)}{2} \bmod n=\displaystyle \frac{i \times (i+1)}{2} \bmod n\) 即可。

设存在一个数 \(k\),使 \(\displaystyle \frac{ki \times (ki+1)}{2} \bmod n=\displaystyle \frac{i \times (i+1)}{2} \bmod n\),其中 \(1 \le i \le n\),在解出 \(k\) 后,\(p\) 的上界也可以确定。(其实 \(k\) 就是上面的 \(h\))

解出 \(k\) 为大于 \(0\) 的 \(n\) 的偶数倍。所以 \(p\) 就只需要取 \(n\) 的偶数倍就行了。\(k\) 表示的其实就是能完成从 \(0\) 到 \(n-1\) 循环的数。

但是以上所有情况都是建立在一开始从零号位开始并且至少使用一点力气的情况下。实际上并不一定是从零开始,在通过上述方式算出 \(p\) 后,减去初始的格子位置,也是题目中的 \(x\),才最符合推理。(其实减不减去 \(x\) 都无所谓,只是减去后会严谨一点)

如果 \(p\) 本身就很小的话,也没有必要更新它的值。

代码

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1e9 + 7
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i) //-(~i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i) //~(-i)
using namespace std;
inline ll QuickPow(ll a , ll b)
{
	if(b == 0)
	{
		return 1;
	}
	ll k = QuickPow(a , b >> 1);
	if(b & 1)
	{
		return k * k * a;
	}
	return k * k;
}
ll T , n , x , p;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> T;
	while(T--)
	{
		cin >> n >> x >> p;
		ll flag = 0;
		fr(i , 1 , min(p , 2 * n - x))
		{
			ll now = (1 + i) * i / 2;
			if((x + now) % n == 0)
			{
				cout << "Yes" << '\n'; 
				flag = 1;
				break;
			}
		}
		if(!flag)
		{
			cout << "No" << '\n';
		}
	}
	return 0;
}

标签:Pull,frac,bmod,题解,ll,times,now,CF1804C,displaystyle
From: https://www.cnblogs.com/xhqdmmz/p/18126543

相关文章

  • P3891 [GDOI2014] 采集资源 题解
    题面。看到大家都是两个动态规划的写法,来给大家讲一下只用一次动态规划的写法。思路设\(f_{i,j}\)表示工作效率为\(i\),获取\(j\)点资源所需的最短时间,不以苦工设状态是因为苦工会因为后面购买而改变,不太现实。\(tme\)表示答案,即到达\(t\)点资源所需的最短时间。从\(0......
  • P8661 [蓝桥杯 2018 省 B] 日志统计 题解
    好久没写题解了,水一篇。这里主要想讲的是不同的处理方法,在阅读本篇题解前请确保读完题。详解一,排序这很好理解,题目要求将热帖从小到大输出,同时题目中还有相对的时间这一概念,因此将输入的\(id\)与\(ts\)按照优先\(id\)其次\(ts\)的排序方式从小到大,排序,这样输出时就没......
  • CF133B Unary 题解
    题面。在考虑如何优化程序时,不要忽略了这题的纯暴力做法。对于样例2此处样例2的输入应该是++++[>,.<-],也许是翻译问题,但并不重要。思路依据题意,将输入的字符串\(s\)转为其对应的二进制串\(str\),在暴力将\(str\)由二进制转为十进制即可。代码为了防止因为幂运算而......
  • CF1913C Game with Multiset 题解
    翻译初始时你有一个空序列,共\(m\)次操作,每次操作读入两个数\(t_i\),\(v_i\),分为以下两种操作:当\(t_i=1\)时,在空序列中加入\(2^{v_i}\)这一元素。(此时\(0\lev_i\le29\))当\(t_i=2\)时,询问是否存在:取当前序列的某些元素,使它们的的和等于\(v_i\)(此时\(0\lev_i\l......
  • CF1913B Swap and Delete 题解
    翻译给定一个字符串\(s\),你有两种操作:删除一个字符。(花费一枚金币)交换某两个字符的位置。(不花费金币)假设经过若干次操作后得到的字符串为\(t\)。\(t\)是好的当且仅当对于任意的\(i\)(\(1\lei\le|t|\),\(|t|\)为字符串\(t\)的长度),均满足\(t_i\nes_i\)。(\(s\)是......
  • CF1907B YetnotherrokenKeoard 题解
    比较简单,建议评橙。题面。思路对于每个给定的字符串,用两个大根堆来分别记录小写字母与大写字母,注意这里记录时不要记录大写的B和小写的b。每当出现一个B时,从记录大写字母的大根堆中取出目前最后录入的大写字母的位置,标记,接着弹出堆顶元素,标记。小写字母同理。以上操作在......
  • CF1891B Deja Vu 题解
    建议凭橙,思路橙,码量红到橙。题面。思路一,暴力直接依照题意模拟,复杂度\(O(tqn^2)\),看一眼数据范围,妥妥T飞,倒在第三个点。二,逐步优化看一眼数据发现,虽然\(q\)很大,但实际上\(x\)只有三十个值,因此首先预处理出从\(2^1\)到\(2^{30}\)的所有值,摘掉一个\(n\),复杂度\(O......
  • P9750 [CSP-J 2023] 一元二次方程 题解
    题面。直接依照题意模拟即可,注意细节。细节第一注意输出分式时分母为\(1\)不输出,分子为\(0\)直接输出零且不带正负号。第二约分时,\(gcd\)内的两个数应该都是非负实数。第三可以单独输出符号,注意别有多余的符号。第四当方程有两根且均是有理数时,要根据\(2a\)的正......
  • CF1815A Ian and Array Sorting 题解
    题面。直接进入主题吧。思路题目要求非递减序列,很明显,由题目给的操作,一定可以将这个序列的前\(n-1\)项能够满足是非递减序列,最后只需要比较第\(n\)项是否大于等于第\(n-1\)项即可。解释一下为什么。对于序列\(a\),从\(a_1\)开始到\(a_{n-1}\)结束,每次对\(a_i\)......
  • CF1909C Heavy Intervals 题解
    一种似乎更快抽象的解法?题面正文看这道题,给定序列\(l,r,c\),要求重构\(l,r,c\)使得\(\sum_{i=1}^n(r_i-l_i)\timesc_i\)最小。首先可以想到的就是尽量让小的\(r_i-l_i\)乘上大的\(c_i\)。这样子看来\(c_i\)几乎不需要更多的处理,仅需从小到大(或从大到小)排个序。来......