首页 > 其他分享 >洛谷P9573 「TAOI-2」核心共振 题解

洛谷P9573 「TAOI-2」核心共振 题解

时间:2024-08-13 22:20:34浏览次数:11  
标签:P9573 洛谷 int 题解 然后 倍数 余数 共振

Problem

Solution

很容易发现如果 \(p\ge 2n\) 时「共振」的次数一定为 \(0\),所以这时随便怎么输出都行。

考虑一般情况。

首先为 \(p\) 的倍数的数肯定无法与其他不是 \(p\) 的倍数的数组,所以先输出是 \(p\) 的倍数的数。

然后可以想到只需要枚举一个 \(i\) 表示余数,发现只需要枚举 \(1\) 到 \(p\div 2\) 就行(因为要两两余数配对),然后从 \(i\) 开始,每次加 \(p\) 保证余数不变,然后判断这个数有没有超 \(n\),如果没有就输出,然后再判断与之余数相对应的数,容易想到(假设这个数为 \(j\))对应的数即为 \(j-i+p-i\),然后和 \(j\) 一样的判断即可。

注意如果 \(i=p-i\) 时不用考虑 \(j\) 对应的数,因为 \(j\) 对应的数的余数也是 \(i\)​。

可以证明不会有遗漏的数。

Code

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)

int n,p;
void solve()
{
	cin>>n>>p;
	if(p>=2*n){For(i,1,n)cout<<i<<" ";cout<<"\n";return ;}
	for(int i=p;i<=n;i+=p)cout<<i<<" ";
	For(i,1,p/2)
		for(int j=i;j<=n;j+=p)
		{
			cout<<j<<" ";
			if(i!=p-i)
				if(j+p-2*i<=n)
					cout<<j-i+p-i<<" ";
		}
	cout<<"\n";
}
int main()
{
	IOS;
	int T;cin>>T;
	while(T--)solve();

	return 0;
}

标签:P9573,洛谷,int,题解,然后,倍数,余数,共振
From: https://www.cnblogs.com/Wu-ZH/p/18357793

相关文章

  • CF1393B Applejack and Storages 题解
    ProblemSolution注意到能拼出时必须要存在\(2\)组及以上的四个相同的木棍,或者\(1\)组及以上的四个相同的木棍和除此之外的\(2\)组及以上的两个相同的木棍。同时又注意到\(a_i\)很小,所以可以用桶统计,同时实时更新四个相同木棍的组数和两个相同木棍的组数即可。Code#in......
  • 洛谷P7767 DNA 题解
    ProblemSolution考虑DP。设\(dp_{i,0}\)表示前\(i\)个字符全为A的最小操作次数,\(dp_{i,1}\)表示前\(i\)个数全为B的最小操作次数。考虑转移。若当前位为A则\(dp_{i,0}=\min(dp_{i-1,0},dp_{i-1,1}+1)\),\(dp_{i,1}=\min(dp_{i-1,0}+1,dp_{i-1,1}+1)\);若当前位......
  • 洛谷P9539 「AWOI Round 2 B」树学 题解
    ProblemSolution题目要求字典序最小,所以一定要尽可能多的\(a\),而且要尽可能靠前。所以我们只需修改不是\(a\)的位置为\(a\)即可。但若\(a\)的个数比\(r\)大,我们就需要将多余的\(a\)手动改为\(b\)并在接下来的修改中保持不变,所以定义一个\(vis_i\)表示是否一定......
  • 洛谷P9541 「AWOI Round 2 D」数字三角形 题解
    ProblemSolution通过题目意思发现,有三种情况:没有旋转的初始情况旋转一次的情况旋转两次的情况我们考虑怎么处理初始情况,其他情况同理。首先,我们发现经过数和最大一定可以保证是每行的最大值的总和,所以只要计算最小的消耗就可以了。考虑DP,设\(dp_{i,j}\)表示从......
  • 洛谷-P1250 种树
    Abstract传送门Idea显然是一个差分约束系统。不妨用dist[i]表示前i个位置种的树的数目,那么,容易得出下列方程:dist[i]>=dist[i-1]dist[i]-dist[i-1]<=1(每个位置至多能种一颗树)题目要求b到e之间至少种t棵树,其数学形式就是:dist[b]-dist[e-1]>=t依据......
  • CF895B XK Segments 题解 二分
    题目链接:https://codeforces.com/problemset/problem/895/B题目大意给你一个长度为\(n\)的数列\(a_1,a_2,\ldots,a_n\)。求数列中存在多少个不同的下标对\((i,j)\)满足如下条件:\(a_i\lea_j\)并且恰好有\(k\)个整数\(y\)满足\(a_i\ley\lea_j\)且\(y\)......
  • 题解:CF1957A Stickogon
    原地址:这里思路首先看样例41121162233339422224244首先可以肯定当\(t\)为\(1\)和\(2\)时不能组成多边形,易知要组成最多的多边形,三角形更有性价比,观察样例\(t\)为\(6\)可以发现,只要用相同的木棍除以\(3\)取整便是答案,可能会有人问了,那我用......
  • 题解:AT_abc352_c [ABC352C] Standing On The Shoulders
    原地址:这里大意几个吃饱了撑的巨人在玩叠罗汉,每个人踩在前一个人的肩膀上,求这个叠罗汉最高有多高。思路直接先求出所有巨人的肩高之和,然后再一个一个枚举看加上哪一个巨人的头高最大就行了。代码#include<iostream>usingnamespacestd;inta[200005],b[200005];intmain......
  • 题解:CF1971B Different String
    原地址:这里题意给出字符串\(s\),询问更改\(s\)的排列顺序后与原来的\(s\)是否不同,不同输出YES,否则输出NO。思路只要判断字符串中含有不同的字符即可。代码#include<iostream>#include<cstdio>usingnamespacestd;intmain(){ intt; scanf("%d",&t); while(t-......
  • 洛谷P2758编辑距离超详注解
    注:本蒟蒻第一篇题解本文亦发表于洛谷博客题目跳转题目大意用最少的字符操作次数,将字符串A转换为字符串B。字符操作为:1.删除一个字符;2.插入一个字符;3.将一个字符改为另一个字符。代码思路本题很明显用的是DP1.赋值将dp数组的值赋值到最大2.特殊赋值对......