1. 程式人生 > >*【CodeForces - 1088 ABC】套題比賽,A水題B模擬C構造D互動

*【CodeForces - 1088 ABC】套題比賽,A水題B模擬C構造D互動

A.

Input

The only line contains the integer xx (1≤x≤100)(1≤x≤100).

Output

You should output two integers aa and bb, satisfying the given conditions, separated by a space. If no pair of integers satisfy the conditions above, print "-1" (without quotes).

Examples

Input

10

Output

6 3

Input

1

Output

-1

解題報告:

   就是給你一個x,讓你構造一個a和b,滿足和x的這仨關係就行了。

AC程式碼:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;

int main()
{
	int x,a,b;
	cin>>x;
	int flag = 0;
	for(int i = 1; i<=x; i++) {
		for(int j = i; j<=x; j+=i) {
			if(i*j>x && j/i < x) {
				flag = 1;
				a=j;b=i;break;
			}
		}
		if(flag) break;
	}
	if(flag) printf("%d %d\n",a,b);
	else puts("-1");

	return 0 ;
 }

 


B.

給你n個數的陣列,給一個k。讓你重複執行k次下列操作:每次選中序列中不為0的最小的數並輸出,然後把序列中所有非零的數都減去這個選中的數。如果序列已經都是0了,那就輸出0.

Examples

Input

3 5
1 2 3

Output

1
1
1
0
0

Input

4 2
10 3 5 3

Output

3
2

Note

In the first sample:

In the first step: the array is [1,2,3][1,2,3], so the minimum non-zero element is 1.

In the second step: the array is [0,1,2][0,1,2], so the minimum non-zero element is 1.

In the third step: the array is [0,0,1][0,0,1], so the minimum non-zero element is 1.

In the fourth and fifth step: the array is [0,0,0][0,0,0], so we printed 0.

In the second sample:

In the first step: the array is [10,3,5,3][10,3,5,3], so the minimum non-zero element is 3.

In the second step: the array is [7,0,2,0][7,0,2,0], so the minimum non-zero element is 2.

解題報告:

  先別看哪個Node,,有的時候會誤導你的思路。。其實這題就是將減的數給可持久化一下、、因為你想啊你總不能減一個數,就將序列中的數都變化一下吧,,所以解決方法就是用一個sub來動態記錄變化的數的值。為啥可以這樣呢?因為你雖然要變化整個陣列中的值,,但是其實你就算不變化,,也不會影響下次你取陣列中的最小值(因為大家都減同一個數,相對的大小關係肯定沒變啊)所以就用一個變數記錄就行了。

AC程式碼1:(排序版)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll a[MAX];
int main() {
	int n,k;
	cin>>n>>k;
	for(int i=1; i<=n; i++) scanf("%lld",a+i);
	ll sub=0;
	sort(a+1,a+n+1);
	for(int i=1,j=1;j<=k;i++,j++) {
		if(i>n) {
			printf("0\n");
		} 
		else {
			while(1) {
				if(a[i]!=sub) break;
				i++;
				if(i > n) {
					printf("0\n");break;
				}
			}
			if(i<=n) {
				a[i]-=sub;
				printf("%lld\n",a[i]);
				sub+=a[i];
			}
		}
	}
	return 0;
}

或者用優先佇列也可以寫:

AC程式碼2:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
priority_queue<int, vector<int>, greater<int> > pq;
int n,k;
int main() {
	
	cin>>n>>k;
	for(int i = 1,tmp; i <= n; i ++) {
		scanf("%d",&tmp);
		if(tmp) pq.push(tmp);
	}
	int sub = 0;
	while(k--) {
		if(!pq.empty()) {
			int cur = pq.top();
			while(cur - sub == 0 && !pq.empty()) {
				pq.pop();
				cur=pq.top();
			}
			printf("%d\n",cur-sub);
			sub += (cur-sub);
		}
		else puts("0");
	}
	return 0;
}

不過更適合我的方式其實是先判斷一堆直到只能變成0。然後再看看剩餘的次數是否大於0,如果大於0再輸出k次的0就行了、

 


C.

不想寫題意了。。**構造一眼題

You're given an array aa of length nn. You can perform the following operations on it:

  • choose an index ii (1≤i≤n)(1≤i≤n), an integer xx (0≤x≤106)(0≤x≤106), and replace ajaj with aj+xaj+x for all (1≤j≤i)(1≤j≤i), which means add xx to all the elements in the prefix ending at ii.
  • choose an index ii (1≤i≤n)(1≤i≤n), an integer xx (1≤x≤106)(1≤x≤106), and replace ajaj with aj%xaj%x for all (1≤j≤i)(1≤j≤i), which means replace every element in the prefix ending at ii with the remainder after dividing it by xx.

Can you make the array strictly increasing in no more than n+1n+1 operations?

Input

The first line contains an integer nn (1≤n≤2000)(1≤n≤2000), the number of elements in the array aa.

The second line contains nn space-separated integers a1a1, a2a2, ……, anan (0≤ai≤105)(0≤ai≤105), the elements of the array aa.

Output

On the first line, print the number of operations you wish to perform. On the next lines, you should print the operations.

To print an adding operation, use the format "11 ii xx"; to print a modding operation, use the format "22 ii xx". If ii or xx don't satisfy the limitations above, or you use more than n+1n+1 operations, you'll get wrong answer verdict.

Examples

Input

3
1 2 3

Output

0

Input

3
7 6 3

Output

2
1 1 1
2 2 4

Note

In the first sample, the array is already increasing so we don't need any operations.

In the second sample:

In the first step: the array becomes [8,6,3][8,6,3].

In the second step: the array becomes [0,2,3][0,2,3].

好吧我還是寫一下題意。。就是說給你n個數,給你兩種操作:1.任取一個x,讓區間內所有的數都加上這個x。2.任取一個x,讓區間內所有的數都取模這個x。(其中x<=1e6)。使得這個序列變成一個嚴格遞增序列,讓你輸出每次操作是什麼,和怎麼操作、、

解題報告:

   1分鐘出標算,,10分鐘WA兩發,,剛開始這個大數去了1e7,,(沒讀題),,後來WA1,改成1e6,感覺該沒問題了吧,WA2,,發現後面在取模的時候去的x會超過1e6,,再改成5e5,AC。。

其實這題上來就取個5000左右就行了啊。。

不難構造,,題意都提示的很明顯了,,n+1次操作,那肯定猜一個n次一個1次唄,,然後不難想到加一個大數,然後每次都取模,讓他構造成一個1~n的序列就完事了。

(白白丟掉100分啊,,,心疼)(另外,應該輸出a[i]-i,,別寫成了a[i]-1,,,)

AC程式碼:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll a[MAX];
int main()
{
	int n;
	cin>>n;
	for(int i = 1; i<=n; i++) scanf("%lld",a+i); 
	printf("%d\n",n+1);
	printf("1 %d 500000\n",n);
	for(int i = 1; i<=n; i++) a[i] += 500000;
	for(int i = 1; i<=n; i++) {
		printf("2 %d %lld\n",i,a[i]-i);
	}
	return 0 ;
 }

D.

 未補。抽空學學互動題吧、、