e417: 乘法~乘法~加法~
e417: 乘法~乘法~加法~
題目連結:e417: 乘法~乘法~加法~
題意:
給你N個數字X1~Xn,求出X1X2+X1X3+X1X4+......+XN-2XN-1+XN-2XN+XN-1XN
解法:
乘法公式:
(X1+X2+X3+......+XN-1+XN )^2
=(X1^2+X2^2+X3^2+......+XN-1^2+XN^2) + 2(X1X2+X1X3+X1X4+......+XN-2XN-1+XN-2XN+XN-1XN)
移項可得:
所求=(X1X2+X1X3+X1X4+......+XN-2XN-1+XN-2XN+XN-1XN )= [(X1+X2+X3+......+XN-1+XN )^2 +(X1^2+X2^2+X3^2+......+XN-1^2+XN^2) ]/2
即可在O(N)內完成(暴力解是O(N^2))
time:58ms
memory used:1.1MB
code:
- #include<unistd.h>
- #include<ios>
- using namespace std;
- char buf[1<<20],*p1=buf,*p2=buf;
- inline int gc(){
- return p1==p2&&(p2=(p1=buf)+read(STDIN_FILENO,buf,1<<20),p1==p2)?EOF:*p1++;
- }
- inline void pc(char c) {
- constexpr size_t buf_size = 1 << 20;
- static char buf[buf_size];
- static char *ptr = buf;
- if (ptr >= buf + buf_size || c == EOF) write(STDOUT_FILENO,buf, ptr - buf), ptr = buf;
- if (c != EOF) *ptr++ = c;
- }
- inline void print(long long x) {
- if(x==0){pc('0');return;}
- static int stk[20];
- int *ptr;
- ptr=&stk[0];
- while(x){*ptr=x%10;x/=10;ptr++;}
- ptr--;
- while(ptr>=(&stk[0])){pc(*ptr+'0');ptr--;}
- pc('\n');
- }
- template<typename T>
- inline bool rit(T &x){
- char c;
- for(x=0,c=gc();c<'-';c=gc())if(c==EOF)return false;
- for(;c>='0';x=x*10+c-'0',c=gc());
- return true;
- }
- int main(){
- int n,a;
- while(rit(n)){
- long long sum1=0,sum2=0;
- for(int i=0;i<n;i++){
- rit(a);
- sum1+=a;
- sum2+=(a*a);
- }
- print((sum1*sum1-sum2)>>1);
- }
- pc(EOF);
- }
本人的分享到此結束
若有更好的想法或建議,請在留言區留言喔
Comments
Post a Comment