Codeforces Bubble Cup 8 - Finals [Online Mirror]H. Bots 数学
2015-09-06 23:11
411 查看
H. Bots
Time Limit: 1 SecMemory Limit: 256 MB
题目连接
http://codeforces.com/contest/575/problem/HDescription
Sasha and Ira are two best friends. But they aren’t just friends, they are software engineers and experts in artificial intelligence. They are developing an algorithm for two bots playing a two-player game. The game is cooperative and turn based. In each turn, one of the players makes a move (it doesn’t matter which player, it's possible that players turns do not alternate).Algorithm for bots that Sasha and Ira are developing works by keeping track of the state the game is in. Each time either bot makes a move, the state changes. And, since the game is very dynamic, it will never go back to the state it was already in at any point in the past.
Sasha and Ira are perfectionists and want their algorithm to have an optimal winning strategy. They have noticed that in the optimal winning strategy, both bots make exactly N moves each. But, in order to find the optimal strategy, their algorithm needs to analyze all possible states of the game (they haven’t learned about alpha-beta pruning yet) and pick the best sequence of moves.
They are worried about the efficiency of their algorithm and are wondering what is the total number of states of the game that need to be analyzed?
Input
The first and only line contains integer N.1 ≤ N ≤ 106
Output
Output should contain a single integer – number of possible states modulo 109 + 7.Sample Input
2
Sample Output
19HINT
题意有两个人,问你两个人都走n次的状态一共有多少种
题解:
打表打表,然后推推数学
推出来是这个:2*(2*n-1)!/(n!*(n-1)!)-1
那就随便搞搞就好啦
代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const ll Mod=1000000007LL; ll f[2000010]; void build() { f[0]=1LL; for(int i=1;i<=2000005;i++) f[i]=i*f[i-1]%Mod; } ll fp(ll a,ll k) { ll res=1LL; while(k) { if(k&1)res=res*a%Mod; a=a*a%Mod; k>>=1; } return res; } ll C(int n,int k) { if(k>n)return 0LL; return f *fp(f[k],Mod-2)%Mod*fp(f[n-k],Mod-2)%Mod; } int main() { build(); int n; scanf("%d",&n); n++; ll ans=(2*C(2*n-1,n)+Mod-1)%Mod; printf("%I64d\n",ans); }
相关文章推荐
- WIN7 X64 PASSUAC 源码
- 第一百五十七天 how can I 坚持。
- ActiveMQ 使用场景
- Redis--rdb快照恢复
- netty源码分析
- 项目实战No3 推荐标签
- restify Server API
- ExtJs基础
- 构建自己的PHP框架--抽象框架的内容
- Android 通过Uri获取Bitmap对象
- 大数模板
- 【DirectX 游戏开发基础】自制游戏微型引擎
- 零基础学python-11.5 真值测试与if...else...三元表达式
- 零基础学python-11.5 真值测试与if...else...三元表达式
- phalcon:跟踪sql语句
- 命令式和声明式
- 不用重新安装ZendStudio更新版本方法
- CSS3的布局学习
- 机器学习实战之朴素贝叶斯
- springmvc中格林威治时间插入数据库失败