HDU6415 Rikka with Nash Equilibrium
HDU6415 Rikka with Nash Equilibrium
找规律 + 大数
由于规律会被取模破坏,所以用了java
找出规律的思路是:
对于一个n*m的矩阵构造,我先考虑n*1的构造,很容易知道它是n!种方法。然后对于n*2的矩阵构造,就是在n*1的矩阵中新加入n个元素的排列组合,当然这里面一定会有非法的情况。通过打表可以暴力的搜出5*5以内的答案,所以我就可以知道从n*1的矩阵扩展到n*2的矩阵中有多少种非法组合(n <= 5 只知道小数据)。同理对于n*2扩展到n*3以后到n*(m-1)扩展到n*m的正确方案数和每次剔除的方案数就可以得到(小数据暴力得到)。然后发现规律 每次正确合法方案数:非法方案数 = i :(n-1);i从2迭代到m就可以得到答案。
java版本:
//package acm; import java.math.BigInteger;
import java.awt.Container;
import java.math.*;
import java.math.BigInteger;
import java.util.*; import org.omg.PortableServer.ID_ASSIGNMENT_POLICY_ID;
public class Main
{ public static void main(String[] args)
{
Scanner cin=new Scanner(System.in);
int t = cin.nextInt();
for(int i=;i<=t;i++)
{
int n = cin.nextInt();
int m = cin.nextInt();
BigInteger k = cin.nextBigInteger(); if(n==)
{
BigInteger ans = BigInteger.ONE;
for(int j=;j<=m;j++)
{
ans = ans.multiply(BigInteger.valueOf(j));
}
ans = ans.mod(k);
System.out.println(ans);
}
else {
BigInteger ans1 = BigInteger.ONE;
for(int j=;j<=n;j++)
{
ans1 = ans1.multiply(BigInteger.valueOf(j));
} //System.out.println(ans1);
for(int j=;j<=m;j++)
{
BigInteger tt = BigInteger.valueOf(j*n);
BigInteger temp = BigInteger.ONE;
for(int kk=;kk<n;kk++)
{
temp = temp.multiply(tt.subtract(BigInteger.valueOf(kk)));
}
ans1 = ans1.multiply(temp);
ans1 = ans1.multiply(BigInteger.valueOf(j)).divide(BigInteger.valueOf(j+n-)); }
ans1 = ans1.mod(k);
System.out.println(ans1);
}
}
cin.close();
}
}
这道题也可以用c++来通过对数进行拆分成质数的乘积来记录大数(因为保证了过程中除法都是整除)
c++版本:
#include <bits/stdc++.h> using namespace std; int cnt[],prime[],tag[];
void init(int n){
int cnt = ;
for(int i = ;i <= n;++i){
if(!tag[i]) prime[cnt++] = i;
for(int j = ;j < cnt && prime[j] * i <= n;++j){
tag[i*prime[j]] = ;
if(i % prime[j] == ) break;
}
}
}
vector<int> V[];
long long mod;
long long power(long long a,long long k){
long long ret = ;
while(k){
if(k & ) ret = ret * a % mod;
a = a * a % mod;
k >>= ;
}
return ret;
} int main()
{
init();
int T;
cin >> T;
for(int i = ;i < ;++i){
for(long long j = ;j * prime[i] <= ;++j){
V[prime[i]*j].push_back(i);
}
}
while(T--)
{
memset(cnt,,sizeof(cnt));
int n,m;
scanf("%d%d%lld",&n,&m,&mod);
for(int i = n*m;i > ;--i){
int siz = V[i].size();
int tmp = i;
for(int j = ;j < siz;++j){
while(tmp%prime[V[i][j]] == ) tmp /= prime[V[i][j]],cnt[V[i][j]]++;
}
}
for(int i = ;i <= m;++i){
int tmp = n-+i;
int siz = V[tmp].size();
for(int j = ;j < siz;++j){
while(tmp%prime[V[n-+i][j]] == ) tmp /= prime[V[n-+i][j]],cnt[V[n-+i][j]]--;
}
tmp = i;
siz = V[tmp].size(); for(int j = ;j < siz;++j){
while(tmp%prime[V[i][j]] == ) tmp /= prime[V[i][j]],cnt[V[i][j]]++;
}
}
long long ans = ;
for(int i = ;i < ;++i){
ans = ans * power(prime[i],cnt[i]) % mod;
}
cout << ans << endl;
}
return ;
}
HDU6415 Rikka with Nash Equilibrium的更多相关文章
- 杭电多校第九场 HDU6415 Rikka with Nash Equilibrium dp
Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K ...
- hdu6415 Rikka with Nash Equilibrium (DP)
题目链接 Problem Description Nash Equilibrium is an important concept in game theory. Rikka and Yuta are ...
- hdu-6415 Rikka with Nash Equilibrium dp计数题
http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值 ...
- 【杂题总汇】HDU2018多校赛第九场 Rikka with Nash Equilibrium
[HDU2018多校赛第九场]Rikka with Nash Equilibrium 又是靠这样一道题擦边恰好和第两百名分数一样~愉快
- HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)
Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K ...
- [hdoj6415 Rikka with Nash Equilibrium][dp]
http://acm.hdu.edu.cn/showproblem.php?pid=6415 Rikka with Nash Equilibrium Time Limit: 10000/5000 MS ...
- HDU 6415 Rikka with Nash Equilibrium (计数DP)
题意:给两个整数n,m,让你使用 1 ~ n*m的所有数,构造一个矩阵n*m的矩阵,此矩阵满足:只有一个元素在它的此行和此列中都是最大的,求有多种方式. 析:根据题意,可以知道那个元素一定是 n * ...
- 三十分钟理解博弈论“纳什均衡” -- Nash Equilibrium
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 纳什均衡(或者纳什平衡),Nash ...
- hdu6415 记忆化搜索或找规律
Rikka with Nash Equilibrium Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Sub ...
随机推荐
- Spring Boot 之 springcache的使用
一.开启 springcache,启动类添加 @EnableCaching 注解 @SpringBootApplication @EnableCaching public class Gatherin ...
- 剑指offer--day11
1.1 题目:字符串的排列:输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba ...
- 红黑树插入操作---以JDK 源码为例
红黑树遵循的条件: 1.根节点为黑色. 2.外部节点(叶子节点)为黑色. 3.红色节点的孩子节点为黑色.(由此,红色节点的父节点也必为黑色) 4.从根节点到任一外部节点的路径上,黑节点的数量相同. 节 ...
- PTA第四周作业
一.本周完成的作业 7-2 选择法排序 (20 分) 本题要求将给定的n个整数从大到小排序后输出. 输入格式: 输入第一行给出一个不超过10的正整数n.第二行给出n个整数,其间以空格分隔. 输出格式: ...
- 用命令行远程导出MySQL数据
mysqldump -h10.10.9.197 -uroot -proot --default-character-set=utf8 0610_eshop >C:/Users/Adm inist ...
- 2101 可达性统计(拓扑排序/dfs+状态压缩)
[题目描述] 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. [题目链接] 2101 可达性统计 [算法] 拓扑排序之后逆序计算(感觉dfs更好写而且应 ...
- PCIe基础篇(一)、基础知识扫盲
1.PCIe:Peripheral Component interconnect Expess,外围组件接口互联,属于第三代IO总线,PCIe的传输速率指的是实际的有效传输速率,为RAW data(原 ...
- C#中的==和Equals的区别
一,值类型中的比较,对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false. ; ; bool bi1 = ai.Equals(bi); //true bool b ...
- [SheetJS] js-xlsx模块学习指南
简介 SheetJS是前端操作Excel以及类似的二维表的最佳选择之一,而js-xlsx是它的社区版本. js-xlsx将注意力集中到了数据转换和导出上,所以它支持相当多种类的数据解析和导出.不仅仅局 ...
- js中数组遍历常用的方法
常见的数组遍历方法,比如 for in,for of, forEach,map,filter,every,some,find,reduce等 1,普通for循环,经常用的数组遍历 var arr = ...