zoukankan      html  css  js  c++  java
  • 【HDU2007】平方和与立方和

    http://acm.hdu.edu.cn/showproblem.php?pid=2007

    垃圾水题

    随便搜了几个公式(但我实际写的暴力。。。题目保证不爆int,说明n,m<=10^3)

    1^2+2^2+3^2+...+n^2

    利用立方差公式 
    n^3-(n-1)^3=1*[n^2+(n-1)^2+n(n-1)] 
    =n^2+(n-1)^2+n^2-n 
    =2*n^2+(n-1)^2-n 
    2^3-1^3=2*2^2+1^2-2 
    3^3-2^3=2*3^2+2^2-3 
    4^3-3^3=2*4^2+3^2-4 
    .
    n^3-(n-1)^3=2*n^2+(n-1)^2-n 
    各等式全相加 
    n^3-1^3=2*(2^2+3^2+...+n^2)+[1^2+2^2+...+(n-1)^2]-(2+3+4+...+n) 
    n^3-1=2*(1^2+2^2+3^2+...+n^2)-2+[1^2+2^2+...+(n-1)^2+n^2]-n^2-(2+3+4+...+n) 
    n^3-1=3*(1^2+2^2+3^2+...+n^2)-2-n^2-(1+2+3+...+n)+1 
    n^3-1=3(1^2+2^2+...+n^2)-1-n^2-n(n+1)/2 
    3(1^2+2^2+...+n^2)=n^3+n^2+n(n+1)/2=(n/2)(2n^2+2n+n+1) 
    =(n/2)(n+1)(2n+1) 
    1^2+2^2+3^2+...+n^2=n(n+1)(2n+1)/6
    另外一个很好玩的做法 
    想像一个有圆圈构成的正三角形,
    第一行1个圈,圈内的数字为1 
    第二行2个圈,圈内的数字都为2,
    以此类推 
    第n行n个圈,圈内的数字都为n,
    我们要求的平方和,就转化为了求这个三角形所有圈内数字的和.设这个数为r 
    下面将这个三角形顺时针旋转60度,得到第二个三角形 
    再将第二个三角形顺时针旋转60度,得到第三个三角形 
    然后,将这三个三角形对应的圆圈内的数字相加,
    我们神奇的发现所有圈内的数字都变成了2n+1 
    而总共有几个圈呢,这是一个简单的等差数列求和 
    1+2+……+n=n(n+1)/2 
    于是3r=[n(n+1)/2]*(2n+1) 
    r=n(n+1)(2n+1)/6

    1^2+2^2+···n^2=1/6*n*(n+1)*(2n+1);
    1^2+2^2+···(2n)^2=1/6*2n*(2n+1)*(4n+1);
    2^2+4^2+6^2+···+(2n)^2=4*(1^2+2^2+···+n^2)=4*1/6*n*(n+1)*(2n+1);
    1^2+3^2+···+(2n-1)^2=1/6*2n*(2n+1)*(4n+1)-4*1/6*n*(n+1)*(2n+1);


    code

    // <2007.cpp> - 11/17/16 08:40:30
    // This file is made by YJinpeng,created by XuYike's black technology automatically.
    // Copyright (C) 2016 ChangJun High School, Inc.
    // I don't know what this program is.
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    typedef long long LL;
    int main()
    {
    	freopen("2007.in","r",stdin);
    	freopen("2007.out","w",stdout);
    	int n,m;
        while(~scanf("%d%d",&n,&m)){
            if(n>m)swap(n,m);
            LL ans1=0,ans2=0;
            for(LL i=n;i<=m;i++)
                if(i&1)ans1+=i*i*i;
                else ans2+=i*i;
            printf("%lld %lld
    ",ans2,ans1);
        }
    	return 0;
    }
  • 相关阅读:
    在windows桌面显示IP等信息的小工具分享
    oracle,根据查询结果结构创建新表
    Oracle多表关联如何更新多个字段
    我想实现一个通用的配置读写类
    【转】Android程序右上角不显示3个点的菜单
    python发送 IBM lotus Notes 邮件
    当超过端口MTU时
    为什么telnet可以用来检查TCP端口是否正常?
    55+手绘网站设计 – 构建极具创新效果的网站
    炫酷动态静图40例——多图杀猫
  • 原文地址:https://www.cnblogs.com/YJinpeng/p/6073117.html
Copyright © 2011-2022 走看看