Codeforces 1166 D. Cute Sequences 构造

这场好有毒啊~进去就被C、E俩结论题关了。

赛后补题发现其实D也很容易构造。

题意是请你构造一个长度在50以内的序列,第一项是a,最后一项是b,序列的每一项都是前缀和再加上$r_{i}$,然后规定$1<=r_{i}<=m$。

显然我们可以发现在$r_{i}$对$x_{j}$的贡献是非常容易计算的

for(i=1;i<=50;i++)for(i0=0;i0<i;i0++)dic[i]+=dic[i0];

用dic[i]表示$r_{p}$对$x_{p+i}$的贡献。

然后我们要规定序列的长度,这个的话,我是求出每个长度的上下界,如果b在上下界内,这个长度就可行,如果b大于上界后同时也大于下界,那显然就要输出-1。

有了长度之后我们就直接求解每一项的具体值即可,在原来的上界的基础上,我们可以减回$[0,m-1]$,来使得$x_{n}$符合我们的要求减小到b。

以下是具体实现代码:

#include<bits/stdc++.h>
using namespace std;
int i,i0,n;
long long L[55],R[55],preL[55],preR[55],dic[55];
int main()
{
    dic[0]=1;
    for(i=1;i<=50;i++)for(i0=0;i0<i;i0++)dic[i]+=dic[i0];
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long a,b,m;
        scanf("%lld %lld %lld",&a,&b,&m);
        preL[1]=L[1]=preR[1]=R[1]=a;
        if(a==b)
        {
            printf("1 %lld\n",a);
            continue;
        }
        for(i=2;1;i++)
        {
            L[i]=preL[i-1]+1;
            preL[i]=preL[i-1]+L[i];
            R[i]=preR[i-1]+m;
            preR[i]=preR[i-1]+R[i];
            if(R[i]>=b)break;
        }
        if(L[i]>b)printf("-1\n");
        else
        {
            n=i;
            for(i=2;i<=n;i++)
            {
                if(R[n]>b)
                {
                    long long d=min(m-1,(R[n]-b)/dic[n-i]);
                    for(i0=i;i0<=n;i0++)R[i0]-=d*dic[i0-i];
                }
            }
            printf("%d",n);
            for(i=1;i<=n;i++)printf(" %lld",R[i]);
            printf("\n");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/megalovania/p/10888493.html

时间: 2024-10-12 06:50:53

Codeforces 1166 D. Cute Sequences 构造的相关文章

【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

[题目链接]click here~~ [题目大意] Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo1000000007(109?+?7). [解题思路] /*A - Jzzhu and Sequences Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(

Codeforces 346C Number Transformation II 构造

题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #define N 100010 #define L(x) (x<<1) #define R(x) (x<<

codeforces 446A DZY Loves Sequences

codeforces   446A   DZY Loves Sequences         题目链接:http://codeforces.com/problemset/problem/446/A 题目大意:给出一个定长为n的数列a,问改动当中一个数后.可能出现的最长严格上升子段的长度是多少. 题目分析:先不考虑"改动当中一个数"这个条件,这样问题就简单多了,从前到后遍历计数就可以(定义一个数组inc[]长度同a,初始化全部点为1,遍历假设当前点a[i]>a[i-1]就置inc

Codeforces 1166 F. Vicky&#39;s Delivery Service 并查集+set

题意:有n个点,m条边,边有c种颜色,q次操作. 每个边都有一种颜色. 然后操作有两种,一种是再加一条边,另一种是查询能否从x达到y. 移动的限制是,连着走两步必须是同一种颜色,如果走奇数步,最后一步可以是任意颜色. 例子:1-2-3-4-5-6. 这个题颜色种类很多,我是用map<int,vector<int>>来存边. 我们首先可以想到 对于点x同种颜色连着的点都是可以相互移动的,所以我们可以用这种方法将它们用并查集合并,所以我们也可以直接map<int,int>来

Codeforces 464A No to Palindromes!(构造)

题目链接:Codeforces 464A No to Palindromes! 题目大意:给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,并 且说同样不存在长度大于2的回文子串. 解题思路:直接去构造即可,从最后一位开始,每次只要考虑该字符是否和前两个字符相同即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std;

【CodeForces 990C】 Bracket Sequences Concatenation Problem

题目链接 luogu &  CodeForces 题目描述 A bracket sequence is a string containing only characters "(" and ")". A regular bracket sequence is a bracket sequence that can be transformed into a correct arithmetic expression by inserting charact

codeforces 622. Optimal Number Permutation 构造

题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间....这样就构造好了. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmat

CodeForces 450B Jzzhu and Sequences

矩阵快速幂. 首先得到公式 然后构造矩阵,用矩阵加速 取模函数需要自己写一下,是数论中的取模. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; long long MOD = 1e9 + 7; long long x, y; int n; long long mod(long l