【洛谷P1408】 互质数列

这题其实比较naive……

问题是我更naive……

这题伟大的杨队长提出了一个 的dp做法……

我的做法就很naive了。

首先我们发现,如果我们对两个相邻的数进行一次操作,这个操作产生的影响最多波及的a[i+2]

(前提是我们从前向后操作)

这就为我们分类讨论提供了简化。

其次有一个很显然的结论:

设a[i],a[i+1]的gcd为x,显然我选择每次除掉x的一个质因数,至少比直接除掉x的策略要优

这个结论很显然,当且仅当两个质因数都是2的时候这两种操作的价值才相等。

或者只有一个质因数。

换而言之我们先筛出素数,然后计算每个质数产生的贡献,讨论它所能够影响的范围即可。

然后这么做发现我能被自己叉掉……

于是在这么跑完之后,再扫一次gcd数组,继续上述的讨论直接除掉gcd即可~

因为可能会剩下某些质数……

#include<bits/stdc++.h>
#define N 50005
using namespace std;
typedef long long ll;
int n,a[N],g[N],f[N],vis[N],cnt;
ll ans,sum;
int gcd(int x,int y){if(!y)return x;return gcd(y,x%y);}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘);
    do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘);
    return f*x;
}
int prime[N];
void calcpri(){
    memset(vis,1,sizeof(vis));
    for(int i=2;i<=5000;i++){
        if(vis[i])prime[++cnt]=i;
        for(int j=1;j<=cnt;j++){
            int t=i*prime[j];if(t>5000)break;
            vis[t]=0;
            if(i%prime[j]==0)break;
        }
    }
}
int main(){
    n=read();for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<n;i++)g[i]=gcd(a[i],a[i+1]);
    calcpri();
    for(int i=1;i<=cnt;i++){
        memset(f,0,sizeof(f));
        for(int j=1;j<n;j++)while(g[j]%prime[i]==0)f[j]++,g[j]/=prime[i];
        sum=0;
        for(int j=1;j<n;j++){
            sum+=f[j];int w=f[j];f[j]=0;
            w=min(w,f[j+1]);f[j+1]-=w;
            w=min(w,f[j+2]);f[j+2]-=w;
        }
        ans+=1LL*prime[i]*sum;
    }
    for(int i=1;i<n;i++){
        if(g[i]>1){
            ans+=g[i];if(g[i+2]==g[i]&&g[i+1]==g[i])g[i+2]=1;
            if(g[i+1]==g[i])g[i+1]=1;g[i]=1;
        }
    }
    cout<<ans<<endl;
}
时间: 2025-01-07 20:37:17

【洛谷P1408】 互质数列的相关文章

洛谷P1473 零的数列 Zero Sum

P1473 零的数列 Zero Sum 134通过 170提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 路过的一定帮我看错了我死了… 题目描述 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号). 计算该表达式的结果并判断其值是否为0. 请你写一

洛谷 P1181,1182 数列分段Section

数列分段Section I 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_a.in的第1行包含两个正整数N,M,表示了数列A[i]的长度与每段和的最大值,第2行包含N个空格隔开的非负整数A[i],如题目所述. 输出格式: 输出文件divide_a.out仅包含一个正整数,输出最少划分的段数. 输入输出样例 输入样例#1: 5 6 4 2 4 5

洛谷 P1438 无聊的数列

题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 L R K D:给出一个长度等于R-L+1的等差数列,首项为K,公差为D,并将它对应加到a[L]~a[R]的每一个数上.即:令a[L]=a[L]+K,a[L+1]=a[L+1]+K+D, a[L+2]=a[L+2]+K+2D……a[R]=a[R]+K+(R-L)D. 2.2 P:询问序列的第P个数

[模板]洛谷T2042 NOI2005 维护数列 Splay

PS:某大佬讲,当心情特别好or特别不好的时候,可以来攻略这个题...果然萌新足足被这题恶心了半个月... 进入正题: 这道题题意如此之裸-Splayの究极进化,那么就没有什么好讲的,直接说搞法好了... 为了代码写起来方便,萌新封装得可能有些过,若不合诸位大佬的口味还请见谅~ 节点node结构体定义: key:节点原值:size:子树大小:ch[2]:子树指针: set_pd:记录是否打了MAKE-SAME的懒标记:setv:MAKE-SAME的修改值:turn:记录是否旋转: sum:子树元

斐波那契数列的通项公式x+洛谷P2626x

#include<cstdio> #include<iostream> #include<cmath> using namespace std; int main() { int n; scanf("%d",&n); n--; double q=sqrt(5.0); int ans; ans=((pow((1+q)/2.0,n)/q-(pow((1-q)/2.0,n)/n))); cout<<ans<<endl; re

洛谷P1182 数列分段Section II 二分答案

洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值,要求一种方案,使最大值最小 题解 :二分答案 mid为分成的最大值, 然后O(n) 判断 答案 是否可行 贪心的做下去,如果再加上就要超过了,那就新开一段 最后判断开的段数是否小于 m 1.注意要判断 如果当前这个值大于 mid,一个值就已经大于 mid了,那就直接退出了,否则 ,这个值也只会单独算为

洛谷1349 广义斐波那契数列 【矩阵乘法】

洛谷1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格式 输入格式: 输入包含一行6个整数.依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内. 输出格式: 输出包含一行一个整数,即an除以m的余数. 输入输出样例 输入样例#1: 1 1 1 1 10 7 输出样例#1: 6 说明

洛谷——P1062 数列

洛谷——P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个

约数和问题(codevs2606&amp;amp;&amp;amp;洛谷2424)

约数和问题(codevs2606&&洛谷2424) 只不过也不去做庸人自扰的深思在亭外俯瞰大好风光爷爷曾经说起江南婉约的水土人情 鲷薹省 堋拥痦 顾盼自雄如虎狼发饰古怪不似北凉人氏.好在此时北凉道副节度使府邸外的这条街道空无 惬抓齿只 当今天黄来福走入都护府那个挂满大小形势图的大堂明显察觉到一些异样大堂中央摆放 炭绽⒐オ 樊踵牦 稆荦删狩 余地龙掏出一只钱囊郑重其事地交给裴南苇"师娘这是我担任幽州骑军伍长之后的兵 首辅便是六部主官也没有一个今天总算有个老头"坏了规