7.4总结

news/2024/7/7 21:49:04 标签: 算法

今天写了几道题目

最近,一年级学生马克西姆学习了科拉兹猜想,但他在讲课时没有太注意,所以他认为猜想中提到了以下过程:

有一个变量 $$$x$$$ 和一个常数 $$$y$$$ 。下面的操作要执行 $$$k$$$ 次:

- 将 $$$x$$$ 增加 $$$1$$$ ,然后
- 当数字 $$$x$$$ 能被 $$$y$$$ 整除时,再除以 $$$y$$$ 。

请注意,这两个操作都是在一次操作中依次进行的。

例如,如果数字 $$$x = 16$$$ 、 $$$y = 3$$$ 和 $$$k = 2$$$ ,那么经过一次运算后, $$$x$$$ 变成了 $$$17$$$ ,而经过另一次运算后, $$$x$$$ 变成了 $$$2$$$ ,因为加一后, $$$x = 18$$$ 可以被 $$$3$$$ 整除两次。

鉴于初始值为 $$$x$$$ 、 $$$y$$$ 和 $$$k$$$ ,马克西姆想知道 $$$x$$$ 的最终值是多少。

思路是先凑到y的倍数,在除y,考虑到时间的问题,所以基于二分的思想设置了一个s每次对自己平方再判断能不能整除,复杂度从n降到了logn,一直除到a<b,再凑到a等于b,再除就是1,那么就是对剩下的c的部分对(b-1)取余再加一即为答案。

#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
#define max_int 2147483647
#define max_ll 9223372036854775807
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int all;
	cin>>all;
	while(all--){
		ll a,b,c;
		cin>>a>>b>>c;
		int bo=1;
		while(c){
			ll yu=b-a%b;
			ll s=b,s2=b*b;
			if(yu<=c){
				c-=yu;
				a+=yu;
			}
			else{
				cout<<a+c<<endl;
				bo=0;
				break;
			}
			while(a%b==0){
				s=b;
				while(a%s==0){
					s2=s;
					s*=s;
				}
				a/=s2;
			}
			if(a<b){
			
			if(c>=b-a){
				c-=b-a;
			}else{
				cout<<a+c<<endl;
				bo=0;
				break;
			}
			if(c==0){
				cout<<'1'<<endl;
				bo=0;
				break;
			}
			cout<<c%(b-1)+1<<endl;
			bo=0;
			break;
			}
			//if(bo) cout<<a<<endl;
			//else break;
		}
		if(bo) cout<<a<<endl;
	}
    return 0;
}

关键在组合数的拆分和前缀和处理以及取模的问题。

#include<bits/stdc++.h>
#define ll long long
#define max_int 2147483647
#define max_ll 9223372036854775807
using namespace std;
vector<vector<int>>q(2001,vector<int>(2001));
vector<vector<int>>p(2001,vector<int>(2001));
void solve(int k){
	q[1][1]=1;
	for(int i=0;i<=2000;++i){
		q[i][0]=1;
	}
	for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            q[i][j]=(q[i-1][j]+q[i-1][j-1])%k;
        }
    }
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            p[i][j]=p[i-1][j]+p[i][j-1]-p[i-1][j-1];
            if(q[i][j]==0) p[i][j]+=1;
        }
        p[i][i+1]=p[i][i];
    }
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    int t,k,n,m;
    cin>>t>>k;
    solve(k);
    for(int i=0;i<t;++i){
    	cin>>n>>m;
    	if(m>n) m=n;
        cout<<p[n][m]<<endl;
	}
	return 0;
}


http://www.niftyadmin.cn/n/5535398.html

相关文章

JavaSE (Java基础):面向对象(下)

8.7 多态 什么是多态&#xff1f; 即同一方法可以根据发送对象的不同而采用多种不同的方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多。在句话我是这样理解的&#xff1a; 在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的&…

【Qt知识】window frame 对窗口坐标的影响

在Qt中&#xff0c;窗口框架&#xff08;Window Frame&#xff09;对Widget的尺寸计算和坐标定位有着直接的影响&#xff0c;这主要是因为窗口框架本身占据了一定的空间&#xff0c;包括标题栏、最小化/最大化/关闭按钮以及边框。这部分额外的空间在不同的应用场景下需要被考虑…

C++视觉开发 一.OpenCV环境配置

一.OpenCV安装环境配置 1.OpenCV安装 &#xff08;1&#xff09;下载 官方下载链接&#xff1a;http://opencv.org/releases 这边选择需要的版本&#xff0c;我是在windows下的4.9.0。&#xff08;科学上网下载很快&#xff0c;否则可能会有点慢&#xff09; (2)安装 双击下…

Day38:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

MAC下的PDM工具

还在为MAC电脑下数据库设计发愁吗&#xff1f;从Windows切换到MAC&#xff0c;除了因为做苹果开发以外&#xff0c;更大的一个理由是不想被工具束缚&#xff0c;使用习惯不一样&#xff0c;不要紧。就像钱一样&#xff0c;当我们成为钱的习惯就成为钱的奴隶了。但是用MAC一年多…

DC/AC电源模块:为智能家居设备提供恒定的电力供应

BOSHIDA DC/AC电源模块&#xff1a;为智能家居设备提供恒定的电力供应 DC/AC电源模块是一种常见的电源转换器&#xff0c;它将直流电源&#xff08;DC&#xff09;转换为交流电源&#xff08;AC&#xff09;&#xff0c;为智能家居设备提供恒定的电力供应。在智能家居系统中&a…

常见sql语句练习

Tips&#xff1a;之前查看网上的文章感觉太乱了&#xff0c;所以自己整理了一套sql语句来练习&#xff0c;主要也可以拿来应对面试&#xff0c;需要的可以自行下载练习 包含基本语句、聚合函数、模糊查询、范围查询、排序、聚合、分组、分页、子查询、索引和视图、左右连接、双…

视频剪辑,你一定要知道这9个工具

在抖音上制作爆款短视频&#xff0c;确实需要借助一些专业的工具来提升视频的质量和吸引力。以下是9个值得推荐的短视频制作工具&#xff0c;它们可以帮助您制作出更具吸引力和专业感的抖音短视频&#xff1a; 剪映&#xff1a; 抖音官方推荐的视频编辑工具&#xff0c;功能全面…