第 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!