一如既往地在 \(lyyz\) 集训。

5.1

今天是练习赛,但感觉今天不适合打比赛,交几道挂几道,被教练一顿凶。

练习赛结果:\(100+26+62+22\)

其中有道 \(DP\) 不错:

C密码本解密:


大概题意就是:

给你一个字符串 \(s\),然后给你 \(n\) 个密码字符串,需要用这些密码字符串拼出 \(s\),字符串拼接过程中可以调换字符顺序。

定义变形成本为原词与变形词不同字符位置的数量。

正解:

\(DP\) 一下,由于 \(n\),\(|s|\) 很小,可以首先枚举一下位置 \(i\) ,然后枚举密码字符串 \(j\),\(dp[i][j]\) 表示以 \(i\) 为开头,接入第 \(j\) 个密码字符串的最小成本,然后 \(dp\) 就好了

Code

#include<bits/stdc++.h>
using namespace std;
string s;
int n;
int tot[103];
string t[2004];
int dp[104];
int cost(string a,string b){
string A=a,B=b;
sort(A.begin(),A.end());
sort(B.begin(),B.end());
if(A!=B) return -1;
int sum=0; for(int j=0;j<=b.size();j++){
if(a[j]!=b[j]) sum++;
}
return sum;
}
signed main(){
cin>>s>>n;
for(int i=1;i<=n;i++){
cin>>t[i];
}
memset(dp,0x3f3f3f,sizeof dp);
dp[0]=0;
for(int i=0;i<s.size();i++){
if(dp[i]==0x3f3f3f||dp[i]==1061109567) continue;
for(int j=1;j+i-1<s.size();j++){
for(int p=1;p<=n;p++){
int c=cost(s.substr(i,j),t[p]);
if(c==-1) continue;
else{
dp[i+j]=min(dp[i+j],dp[i]+c);
}
}
}
}
if(dp[s.size()]!=1061109567) cout<<dp[s.size()];
else cout<<"-1";
}
/*
ogodtsneeencs
6
go
good
do
sentences
tense
scen
*/

5.2

今天主要讲了数论。

A.Luogu P3927


这道题求 \(n!\) 在转 \(k\) 进制后末尾最多有几个 \(0\)

首先,转 \(k\) 进制是不断除以 \(k\),那么如何让末尾为 \(0\) 呢?

肯定就是整除 \(k\)。

那么这道题就成了 \(n!\) 可以整除几个 \(k\)

由于\(n,k\) 很大,于是我们考虑质因数分解。

那么 \(0\) 的个数也就是 \(n!\) 的每个质因子次数除以 \(k\) 的每个质因子质数的最小值。

那么我们想如何求出 \(n!\) 的每个质因子次数呢。

我们可以先枚举 \(k\) 的质因子(因为这个简单的多),然后只需要求这个质数在 \(n!\) 里的次数就行了。

我们知道 \(n!=1 \times 2 \times 3 \times ... \times n\)

那么一个质数 \(p\) 在里面是不是每 \(p\) 个数出现一个 \(k \times p\),那么当第 \(p\) 个 \(p\) 的倍数出现时,这个数是 \(p \times p\) ,将这些 \(p\) 的倍数提出来是不是成了:

\[p \times (1 \times 2 \times ... \times \frac{n}{p})
\]

其中括号里面的又回到了一开始的样子,那么还是每 \(p\) 个出现一次 \(p\) ,所以只要不断以此类推就行了。

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
inline int __(int x,int b){
int sum=0;
while(x){
sum+=x/b;
x/=b;
}
return sum;
}
signed main(){
cin>>n>>k;
int ans=7e18;
for(int i=2;i*i<=k;i++){
int sum=0;
while(k%i==0){
sum++;
k/=i;
}
if(sum!=0) ans=min(ans,__(n,i)/sum);
}
if(k!=0&&k!=1){
ans=min(ans,__(n,k));
}
cout<<ans;
}

B.codeforces 1295D

简单题意

给定两个整数 \(a\) 和 \(m\)。计算满足 \(0<x<m\) 且 \(gcd(a,m)= gcd(a +x,m)\) 的整数的个数。

首先:由于 \(a,m\) 已经给出,所以 \(gcd(a,m)\) 是个常数 ,我们设 \(gcd(a,m)=g\) ,则式子转化为:

\[gcd(a+x,m) = g
\]

式子两边同时除以 \(g\):

\[gcd(a+x,m)\div g=1
\]

我们知道:

\[gcd(a,b) \cdot m =gcd(a \cdot m,b \cdot m)
\]

所以我们可以把 \(\div g\) 看做 \(\cdot \frac{1}{g}\),得:

\[gcd( \frac{a+x}{g},\frac{m}{g})=1
\]

由于,\(m,g\) 都是常数,所以 \(\frac{m}{g}\) 也为常数,设为 \(d\),得:

\[gcd(\frac{a+x}{g},d)=1
\]

由于 \(a\)、\(g\) 为常数,所以当每个 \(x\) 都有唯一一个 \(\frac{a+x}{g}\) 为之对应。由于 \(\frac{a}{g} < \frac{a+x}{g} < \frac{m+a}{g}\),,所以把问题转化为:在 \(\frac{a}{g}\) 到 \(\frac{m+a}{g}\),有多少个数与 \(d\) 互质。

发现 \([\frac{a}{g},\frac{m+a}{g}]\) ,其实是由 \([0,m]\) 平移一段得到的,由于质数的出现是有周期性的,所以就成了求 \(\varphi(d)\)

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
int a,m;
int gcd(int a,int b){
if(b==0) return a;
else{
return gcd(b,a%b);
}
}
int oula(int x){
int ans=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0){
x/=i;
}
}
}
if(x>1) ans=ans/x*(x-1);
return ans;
}
signed main(){
cin>>T;
while(T--){
cin>>a>>m;
int g=gcd(a,m);
int d=m/g;
cout<<oula(d)<<endl;
}
}

C.消失的\(LCM\)

简要题意: 给一个正整数 \(N\),找一个比 \(N\) 大的正整数 \(M\),定义数值\(A=lcm(N+ 1,N + 2,…, M)\) ,数值 \(B=lcm(1,2,…, M)\),使得 \(A=B\) 。

一看到这道题,我们发现,\(A,B\) 什么关系?

明显的包含关系。

那么我们把 \(B\) 分为两段,前部分:\(C=lcm(1,2,...,N)\),后部分很明显就是 \(A\) 了,那么 \(B=lcm(C,A)\)

那么让 \(B=A\) 就是

\[lcm(C,A)=A
\]

这就是一道小学题了:问 \(C,A\) 的关系。

肯定是 \(A=kC\)

倍数关系的话,是不是分解质因数后,\(A\) 的每个质因子的次数都要大于 \(C\) 的质因子次数。

那我们枚举质因子,取最大值就好了。

#include <iostream>
#include <cstdio> using namespace std;
const int MAXN = 1e6;
int prime[MAXN+10], num;
bool a[MAXN+10]; void init(){
num = 0;
a[1] = false;
for(int i = 2; i <= MAXN; i++) a[i] = true;
for(int i = 2; i <= MAXN; i++){
if(a[i]){
prime[++num] = i;
}
for(int j = 1; j <= num; j++){
if(i*prime[j] > MAXN) break;
a[i*prime[j]] = false;
if(i%prime[j] == 0) break;
}
}
}
int slove(int n){
int res = 2;
for(int i = 1; prime[i] <= n && i <= num; i++){
int sum = prime[i];
while(sum <= n/prime[i]) sum *= prime[i];
res= max(res, (n/sum + 1)*sum);
}
return res;
}
int main(){
int n;
init();
scanf("%d", &n);
printf("%d\n", slove(n));
return 0;
}

5.3

依旧模拟赛。

预期分数:[100+100+100+100+0+0+0+0]

实际分数:[100+50+100+50+0+0+0+0]

第二题是被语文阅读理解击败了/ll

C.\(p\)平方\(q\)

简要题意:给一个 \(N\)( \(N \leq 9 \times 10^{18}\) ) ,保证 \(N=p^{2} \cdot q\) (\(p\)、\(q\)为质数),求 \(p\)、\(q\)

首先,由于 \(p\)、\(q\)为质数 ,根据唯一分解定理,我们如果对 \(N\) 进行质因数分解,肯定能求出来,但是时间复杂度 \(\sqrt{N}\) ,是不能接受的。

由于只有 \(p*p*q\),所以我们只要知道 \(p\) 或 \(q\) 其中一个就能知道另一个。很容易就能发现 \(p\) 或 \(q\) 是小于等于 $ \sqrt[3]{N}$ ,这就可以接受了。

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
long long a;
signed main(){
cin>>T;
while(T--){
cin>>a;
int s=0;
int ans2=0;
int ans1=0;
for(int i=2;i*i*i<=a;i++){
int sum=0;
if(a%i==0){
if((long long)(a/i)%i==0){
cout<<i<<" "<<a/i/i<<endl;
break;
}
else{
int p=sqrt(a/i);
cout<<p<<" "<<i<<endl;
break;
}
}
}
}
}
/*
3
2023
63
1059872604593911
*/

五一集训这就结束了,祝大家五一快乐!

[2025五一lyyz集训] 数论+练习赛的更多相关文章

  1. [暑假集训--数论]hdu2136 Largest prime factor

    Everybody knows any number can be combined by the prime number. Now, your task is telling me what po ...

  2. [暑假集训--数论]hdu1019 Least Common Multiple

    The least common multiple (LCM) of a set of positive integers is the smallest positive integer which ...

  3. [暑假集训--数论]poj2115 C Looooops

    A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != ...

  4. [暑假集训--数论]poj1365 Prime Land

    Everybody in the Prime Land is using a prime base number system. In this system, each positive integ ...

  5. [暑假集训--数论]poj2034 Anti-prime Sequences

    Given a sequence of consecutive integers n,n+1,n+2,...,m, an anti-prime sequence is a rearrangement ...

  6. [暑假集训--数论]poj1595 Prime Cuts

    A prime number is a counting number (1, 2, 3, ...) that is evenly divisible only by 1 and itself. In ...

  7. [暑假集训--数论]poj2262 Goldbach's Conjecture

    In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in whic ...

  8. [暑假集训--数论]poj2909 Goldbach's Conjecture

    For any even number n greater than or equal to 4, there exists at least one pair of prime numbers p1 ...

  9. [暑假集训--数论]poj3518 Prime Gap

    The sequence of n − 1 consecutive composite numbers (positive integers that are not prime and not eq ...

  10. [暑假集训--数论]poj1730 Perfect Pth Powers

    We say that x is a perfect square if, for some integer b, x = b 2. Similarly, x is a perfect cube if ...

随机推荐

  1. 面试题40. 最小的k个数

    地址:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/ <?php /** * 面试题40. 最小的k个数 * 输入整数数组 ...

  2. burpsuite激活

    激活burpsuite--教程 点击Start 文件,把三个框都选上 点击RUN,会自动启动,复制一下那个证书 粘贴刚刚复制的密钥,点击下一个即可 这里点击手动激活,复制请求,粘贴到刚刚那个激活程序的 ...

  3. ABAQUS弹塑性分析

    1. 弹塑性分析的主要问题 1.1 elastic-plastic deform behavior abaqus 默认的塑性表现行为是金属材料经典塑性理论,采用mises屈服面定义各向同性屈服. 一般 ...

  4. Jmeter tcp 返回500,但服务器收到请求

    解决方法:再end of line(Eol)bytes value 正确写上报文最后两位十进制字节码

  5. WSL2 - Ubuntu 22.04使用记录

    1 安装 搭配Windows Terminal使用为佳,在微软商店可下载: 然后依照官网描述即可. 命令行中运行wsl --install即可.不过由于想自行指定发行版,于是: wsl --list ...

  6. angular使用nz-zorro的时间选择器,设置可选时间范围

    备份一下 https://blog.csdn.net/qq_34790644/article/details/87098960 https://blog.csdn.net/fsxxzq521/arti ...

  7. Linux下使用sz/rz命令从服务器下载或上传文件

    简介 Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,sz命令用于从Linux服务器下载文件到本地. 安装 yum安装 yum -y install lrzsz 源码安装 ...

  8. CentOS——磁盘分区

    Centos7-磁盘分区磁盘层次结构–磁盘分区方法情况一:磁盘分区–磁盘小于2T fdisk情况二:磁盘分区–磁盘大于2T centos6:parted centos7:fdisk一.磁盘小于2T情况 ...

  9. TidHTTP的post编码,老掉牙的问题

    TidHTTP使用post时,需要提交json字符串. 那么采用什么编码,这个问题就头大了.目前xe已经不要考虑编码转换问题.但是.... 我们使用ISuperObject操控json.那么最后提交到 ...

  10. 小了 60,500 倍,但更强;AI 的“深度诅咒”

    作者:Ignacio de Gregorio 图片来自 Unsplash 的 Bahnijit Barman 几周前,我们看到 Anthropic 尝试训练 Claude 去通关宝可梦.模型是有点进展 ...