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的更多相关文章

  1. 杭电多校第九场 HDU6415 Rikka with Nash Equilibrium dp

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  2. hdu6415 Rikka with Nash Equilibrium (DP)

    题目链接 Problem Description Nash Equilibrium is an important concept in game theory. Rikka and Yuta are ...

  3. hdu-6415 Rikka with Nash Equilibrium dp计数题

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值 ...

  4. 【杂题总汇】HDU2018多校赛第九场 Rikka with Nash Equilibrium

    [HDU2018多校赛第九场]Rikka with Nash Equilibrium 又是靠这样一道题擦边恰好和第两百名分数一样~愉快

  5. HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  6. [hdoj6415 Rikka with Nash Equilibrium][dp]

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 Rikka with Nash Equilibrium Time Limit: 10000/5000 MS ...

  7. HDU 6415 Rikka with Nash Equilibrium (计数DP)

    题意:给两个整数n,m,让你使用 1 ~ n*m的所有数,构造一个矩阵n*m的矩阵,此矩阵满足:只有一个元素在它的此行和此列中都是最大的,求有多种方式. 析:根据题意,可以知道那个元素一定是 n * ...

  8. 三十分钟理解博弈论“纳什均衡” -- Nash Equilibrium

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 纳什均衡(或者纳什平衡),Nash ...

  9. hdu6415 记忆化搜索或找规律

    Rikka with Nash Equilibrium Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Sub ...

随机推荐

  1. python每日一练:0004题

    第 0004 题: 任一个英文的纯文本文件,统计其中的单词出现的个数. import re count = 0 with open('./EnglishText.txt','r') as f: tem ...

  2. jQ全选或取消全选

    function checkAll(chkobj) {        if ($(chkobj).children("span").text() == "全选" ...

  3. thead tbody tfoot

    <!DOCTYPE html> <html lang="en"> <head> <title>Title</title> ...

  4. 前端 CSS的继承性

    css有两大特性:继承性和层叠性 继承性 继承:给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 记住:有一些属性是可以继承下来 : color . font-*. text- ...

  5. SpringBoot-Vue实现增删改查及分页小DEMO

    前言 主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo,实现增删改查.分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程. 开发栈 前端 开 ...

  6. mysql远程命令连接

    #mysql -h 服务器地址 -P 端口 -u账号 -p密码 mysql -uroot -proot

  7. 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结

    中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...

  8. C++析构函数的自动调用(析构函数必须是虚拟的,这样删除父类指针指向的子类对象,才能同时调用两者的析构函数,否则就没有机会调用子类析构函数)

    class A {public: A() { printf("A \n"); } ~A() { printf(" ~A \n"); } // 这里不管写不写vi ...

  9. sparkStreaming复习笔记(1)

    一.SparkStreaming 1.sparkcore模块的扩展,具有可扩展,高吞吐量,容错机制,针对实时数据流处理,数据可以来自于kafka,flume以及tcp套接字,可以使用更加复杂的函数来进 ...

  10. js函数总结

    最近要经常写一些Js代码,总看到同事能使用js高级函数写出比较简洁的js代码,挺羡慕的,于是就花了一些专门时间来学习. forEach.map.reduce 我就不喜欢一上来就给出语法来,先来一个例子 ...