标签:ret cto ++ 注意 mod include pen bsp notice
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; }
标签:ret cto ++ 注意 mod include pen bsp notice
原文地址:http://www.cnblogs.com/liuweimingcprogram/p/6034265.html