zoukankan      html  css  js  c++  java
  • 1049

    http://www.ifrog.cc/acm/problem/1049

    这些数学题我一般都是找规律的。。

    先暴力模拟了前面的那些,然后发现(x, y) = (x, y - 1) + (x - 1, y)得到。

    但是这是没用的。因为要得到(x, y - 1)这些,又要递归处理的话,就会GG。

    然后找到规律是C(x + y, y) - C(x + y, y - 1)

    得闲没事就要多YY。。去试试X和Y中满足什么关系。

    一般都一定要和这两个数有有关,和2 * x这些很少关系。

    #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;
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    const LL MOD = 1e4 + 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;
    }
    LL calc(LL x, LL y) {
        LL ans = (Lucas(2 * x, x, MOD) + MOD - Lucas(2 * x, x + 1, MOD)) % MOD;
        return ans;
    }
    void work() {
        LL x, y;
        cin >> x >> y;
        if (y == 0) {
            cout << 1 << endl;
        } else {
            if (x == y) {
                cout << calc(x, y) << endl;
            } else {
                cout << (Lucas(x + y, y, MOD) - Lucas(x + y, y - 1, MOD) + MOD) % MOD << endl;
            }
        }
    }
    int main() {
    #ifdef local
        freopen("data.txt","r",stdin);
    #endif
    //    for (x = 1; x <= 10; ++x) {
    //        for (y = 0; y <= x; ++y) {
    //            work();
    //        }
    //        cout << endl;
    //    }
        IOS;
        int t;
        cin >> t;
        while (t--) work();
    
        return 0;
    }
  • 相关阅读:
    基于maven构建javaweb项目思路梳理及改进 在路上
    分圆多项式整理
    第03次作业栈和队列
    C语言第二次实验报告
    week01绪论作业
    第02次作业线性表
    C语言第一次实验报告
    工作流的问题
    无法使用Outlook 2003 Out Of Office Assisant
    刷机
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6034265.html
Copyright © 2011-2022 走看看