Virtual Participation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 237 Accepted Submission(s): 56
Special Judge
Given an integer K,
she needs to come up with an sequence of integers A satisfying
that the number of different continuous subsequence of A is
equal to k.
Two continuous subsequences a, b are
different if and only if one of the following conditions is satisfied:
1. The length of a is
not equal to the length of b.
2. There is at least one t that at≠bt,
where at means
the t-th
element of a and bt means
the t-th
element of b.
Unfortunately, it is too difficult for Rikka. Can you help her?
The first line contains one integers n (n≤min(K,105)).
The second line contains n space-separated
integer Ai (1≤Ai≤n) -
the sequence you find.
1 2 3 4
假设用1,1...2,2....3,3....来构造,设他们的数量分别为 x y z
则能构成: x + y + z + x*y + y*z + x*z ( x * z 代表三种数都包含的情况)
枚举 x 与 y ,再判断z是否符合 (方法来源:http://blog.csdn.net/oilover/article/details/47164727)
P: 果然还是太弱,完全没想到╮(╯▽╰)╭,慢慢学,慢慢学
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cmath>
int MAX=0x3f3f3f3f;
using namespace std;
const int INF = 0x7f7f7f;
const int MAXM = 12e4+5;
int ma = 100000; int main()
{ int x,y,z,k;
while(~scanf("%d",&k))
{
if(k == 1)
{
printf("1\n1\n");
continue;
}
if(k == 2)
{
printf("2\n1 1\n");
continue;
}
int flag = 1;
if(k <= 100000)
{
for(int i = 1; i < k; i++)
printf("%d ",1);
printf("1\n");
continue;
}
for(x = 0; x<= 1e5 &&flag ; x++)
for(y = 0; x+y<=1e5 && y <= sqrt(k+0.5) && flag; y++)
{
int t = k - x - y - x*y;
if(t % (x + y + 1) == 0)
{
z = t / (x +y +1);
if(z < 0 || x + y + z > min(k,ma))
continue; int n = x + y + z;
printf("%d\n",n);
for(int i = 1; i <= n; i++)
{
if(i <= x)
printf("1 ");
else
{
if(i <= x + y)
printf("2 ");
else if(i < n)
printf("3 ");
else
printf("3\n");
}
flag = 0;
}
}
}
}
return 0;
}