zoukankan      html  css  js  c++  java
  • Aria's Loops

    https://www.hackerrank.com/contests/101hack41/challenges/arias-loops

    可以看我以前的笔记,http://www.cnblogs.com/liuweimingcprogram/p/6091396.html

    或者我在discusses的题解

    I have my thought in this problem The first thing in the editorial is this problem problem:

    count how many hello world

      for (int i = 1; i <= n; ++i)   

        for (int j = i + 1; j <= n; ++j)     

          for (int k = j + 1; k <= n; ++k)       

            cout << "hello world" << endl;

    observe i < j < k <= n. so this ans is from 1....n select 3 different number,build a triple.The ans will be C(n, 3)

    think more deeply, let define xi be the distance between xi and x(i - 1) so x1 >= 1 because the number start from one.and then x2 >= 1 && x3 >= 1 because they can not be the same. so the ans is the ans of how many solution of x1 + x2 + x3 <= n this is a very classics problem.Go to the internet searching.

    and now this problem can be solve using the second method x1 >= 1 && x2 >= 1 && x3 >= 2 && x4 >= 3 ...... so the ans is C(n - 1 - (k * k - 3 * k) / 2, k); may be my English is very poor so thay you can not understand. I feel so sorry

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define IOS ios::sync_with_stdio(false)
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    #define MY "H:/CodeBlocks/project/CompareTwoFile/DataMy.txt", "w", stdout
    #define ANS "H:/CodeBlocks/project/CompareTwoFile/DataAns.txt", "w", stdout
    
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    LL n, k;
    const int MOD = 1e9 + 7;
    LL quick_pow (LL a,LL b,LL MOD) {
        //求解 a^b%MOD的值
        LL base=a%MOD;
        LL ans=1; //相乘,所以这里是1
        while (b) {
            if (b&1) {
                ans=(ans*base)%MOD; //如果这里是很大的数据,就要用quick_mul
            }
            base=(base*base)%MOD;    //notice
            //注意这里,每次的base是自己base倍
            b>>=1;
        }
        return ans;
    }
    
    LL C (LL n,LL m,LL MOD) {
        if (n<m) return 0; //防止sb地在循环,在lucas的时候
        if (n==m) return 1;
        LL ans1 = 1;
        LL ans2 = 1;
        LL mx=max(n-m,m); //这个也是必要的。能约就约最大的那个
        LL mi=n-mx;
        for (int i = 1; i <= mi; ++i) {
            ans1 = ans1*(mx+i)%MOD;
            ans2 = ans2*i%MOD;
        }
        return (ans1*quick_pow(ans2,MOD-2,MOD)%MOD); //这里放到最后进行,不然会很慢
    }
    LL Lucas (LL n,LL m,LL MOD) {
        LL ans=1;
        while (n && m && ans) {
            ans=ans*C(n%MOD,m%MOD,MOD)%MOD;
            n /= MOD;
            m /= MOD;
        }
        return ans;
    }
    
    
    void work() {
        cin >> n >> k;
        LL N = n - 1 - ((k * k - 3 * k) / 2);
        if (N < 0) cout << 0 << endl;
        else cout << Lucas(N, k, MOD) << endl;
    }
    
    int main() {
    #ifdef local
        freopen("data.txt","r",stdin);
    #endif
        work();
        return 0;
    }
    View Code

    我知道这里不用lucas,但是自己的模板,一复制就是这样,而且这样用lucas复杂度不会增加。

  • 相关阅读:
    ES集群性能调优链接汇总
    【转】dmesg 时间转换
    广师大笔记汉诺塔
    广师大python学习笔记求派的值
    155. 最小栈(c++)
    160. 相交链表(c++)
    论文 数据集总结
    论文阅读 总结 复习
    121. 买卖股票的最佳时机(c++)
    9. 回文数(c++)
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6092691.html
Copyright © 2011-2022 走看看