第 n+1 项——位运算

2023-12-13 04:42:37

给定一个长度为 n+1 的序列 a 的前 n 项和一个数 S ,数列的第 n+1 项初始为 0 。
将一次操作定义为 ai = aj @ ak,其中 @ 为加减乘除(下取整)中的一种。
问是否能通过若干次操作使得第 n+1 项 an+1 = S .输出方案。

Input?
第一行两个整数 n,S (1 ≤ n ≤ 1e5 ,1 ≤ S ≤ 1e18).
第二行 n 个整数,表示序列 a (1 ≤ ai ≤ 1e18).

Output?
第一行一个整数 x ,表示操作次数。
接下来 x 行,每行输出三个整数和一个操作符号( +,-,*,/),用空格分开。
请保证运算过程中 a1,……,an+1,时刻处于[0,2e18]之间,操作次数不超过 200。

输入
5 17
1 2 3 4 5

输出
5
2 2 4 *
6 6 1 +
6 6 2 +
6 6 3 +
6 6 5 +

解析:

可以通过自身除以自身构造出 “1” ,之后通过位运算能构造出任意数。

#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const int N=2e6+10;
int a[N],p[N];
struct node
{
    int x,a,b;
    char p;
}str[N];
int n,s,cnt;
signed main()
{
    ios;
    cin>>n>>s;
    for (int i=1;i<=n;i++) cin>>a[i];
    int len=0;
    while (s)
    {
        p[len++]=s&1;
        s >>=1;
    }
    str[cnt++]={1,1,1,'/'};
    for (int i=0;i<len;i++)
    {
        if (p[i]==1) str[cnt++]={n+1,n+1,1,'+'};
        str[cnt++]={1,1,1,'+'};
    }
    cout<<cnt<<endl;
    for (int i=0;i<cnt;i++) cout<<str[i].x<<" "<<str[i].a<<" "<<str[i].b<<" "<<str[i].p<<endl;
    return 0;
}

文章来源:https://blog.csdn.net/m0_74403543/article/details/134951636
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。