Power Sum
题意:
给定正整数n,求正整数k,使得长度为k(1<=k<=n+2)的数组 a [ i ] ( a [ i ] ∈ { − 1 , 1 } ) a[i](a[i]\in\{-1,1\}) a[i](a[i]∈{−1,1})满足
∑ i = 1 k a i ∗ i 2 = n \sum_{i=1}^k {a_i*i^2}=n i=1∑kai∗i2=n
思路: 找规律(构造)
n 2 − ( n − 1 ) 2 = 2 ∗ n − 1 n^2 - (n-1)^2 = 2*n-1 n2−(n−1)2=2∗n−1
( n − 2 ) 2 − ( n − 3 ) 2 = 2 ∗ n − 5 (n-2)^2 - (n-3)^2 = 2*n-5 (n−2)2−(n−3)2=2∗n−5
两式相减: ( n − 3 ) 2 − ( n − 2 ) 2 − ( n − 1 ) 2 + n 2 = 4 (n-3)^2 - (n-2)^2- (n-1)^2 +n^2= 4 (n−3)2−(n−2)2−(n−1)2+n2=4
即:连续4个数为“1001”时 ,和为4
当得出这个结论时,这个题就基本上搞定了
接下来就是找出1,2,3的表达式,按照题意稍加推理可得:
1=“1”;
2=“0001”; (-1-4-9+16)
3=“01”;(-1+4)
最后直接对输入的数判断即可:
若n%4==0;数组长度为n; 字符串为:k个“1001”;
若n%4==1;长度为n; 字符串为:“1”+k个“1001”;
若n%4==2;长度为n+2; 字符串为:“0001”+k个“1001”;
若n%4==3;长度为n-1; 字符串为:“01”+k个“1001”;
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i<b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define pre1(i,a,b) for(int i=a;i>b;i--)
#define pep(i,stl) for(auto i:stl)
#define INF 0x7fffffff
#define eps 1e-9
#define mem(a,b) memset((a),(b),sizeof(a))
const int N=1e6+1000;
typedef double db;
const int mod=1e9+7;
const double PI = acos(-1);
#define pep(i,stl) for(auto i:stl)
int n,m;
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
int k=n/4;
switch(n%4){
case 0:cout<<n<<endl;break;
case 1:cout<<n<<endl<<"1";break;
case 2:cout<<n+2<<endl<<"0001";break;
case 3:cout<<n-1<<endl<<"01";break;
}
rep(i,1,k) cout<<"1001";
puts("");
}
return 0;
}