Power Sum

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=1kaii2=n

思路: 找规律(构造)

n 2 − ( n − 1 ) 2 = 2 ∗ n − 1 n^2 - (n-1)^2 = 2*n-1 n2(n1)2=2n1

( n − 2 ) 2 − ( n − 3 ) 2 = 2 ∗ n − 5 (n-2)^2 - (n-3)^2 = 2*n-5 (n2)2(n3)2=2n5

两式相减: ( n − 3 ) 2 − ( n − 2 ) 2 − ( n − 1 ) 2 + n 2 = 4 (n-3)^2 - (n-2)^2- (n-1)^2 +n^2= 4 (n3)2(n2)2(n1)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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值