`
阿尔萨斯
  • 浏览: 4214554 次
社区版块
存档分类
最新评论

uva 11916 - Emoogle Grid(大步小步算法)

 
阅读更多

题目连接:uva 11916 - Emoogle Grid

题目大意:有一问题,在M行N列的网格上涂K种颜色,其中有B个格子不用涂色,其它每个格子涂一种颜色,同一列的上下两个相邻的格子不能涂相同的颜色。给出M,N,K和B个格子的位置,求出总方案数模掉1e8+7的结果R。现在已知R,求最小的M。

解题思路:有确定不用涂色格子的区域作为不变部分,总数通过计算为tmp,外加可变部分的第一行,方案数为cnt,可变部分除第一行外,每加一行都将总数乘以(K1)N,既有

  • cntPM=Rmod(1e8+7)
  • PM=cnt1Rmod(1e8+7)
    就是大步小步算法求M。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
#include <algorithm>

using namespace std;
typedef long long ll;
const ll MOD = 1e8+7;
const int maxn = 505;

int N, M, K, R, B, X[maxn], Y[maxn];
set<pair<int, int> > bset;

inline ll mul_mod (ll a, ll b) {
    return (ll)a * b % MOD;
}

inline ll pow_mod (ll a, ll n) {
    ll ans = 1;
    while (n) {
        if (n&1)
            ans = mul_mod(ans, a);
        a = mul_mod(a, a);
        n /= 2;
    }
    return ans;
}

void gcd (ll a, ll b, ll& d, ll& x, ll& y) {
    if (!b) {
        d = a;
        x = 1;
        y = 0;
    } else {
        gcd (b, a%b, d, y, x);
        y -= x * (a/b);
    }
}

inline ll inv (ll a) {
    ll d, x, y;
    gcd(a, MOD, d, x, y);
    return d == 1 ? (x+MOD)%MOD : -1;
}

void init () {
    scanf("%d%d%d%d", &N, &K, &B, &R);
    bset.clear();
    M = 1;
    for (int i = 0; i < B; i++) {
        scanf("%d%d", &X[i], &Y[i]);

        M = max(M, X[i]);

        bset.insert(make_pair(X[i], Y[i]));
    }
}

int count () {
    int c = 0;
    for (int i = 0; i < B; i++) {
        if (X[i] != M && !bset.count(make_pair(X[i]+1, Y[i])))
            c++;
    }

    c += N;
    for (int i = 0; i < B; i++)
        if (X[i] == 1)
            c--;

    return mul_mod(pow_mod(K, c), pow_mod(K-1, (ll)M*N-B-c));
}

int log_mod (ll a, ll b) {
    ll m = (ll)sqrt(MOD+0.5), v, e = 1;
    v = inv(pow_mod(a, m));
    map<ll, ll> g;

    g[1] = 0;

    for (ll i = 1; i < m; i++) {
        e = mul_mod(e, a);
        if (!g.count(e))
            g[e] = i;
    }

    for (ll i = 0; i < m; i++) {
        if (g.count(b))
            return i*m+g[b];
        b = mul_mod(b, v);
    }
    return -1;
}

int doit () {
    int cnt = count();

    if (cnt == R)
        return M;

    int c = 0;
    for (int i = 0; i < B; i++)
        if (X[i] == M)
            c++;

    M++;
    cnt = mul_mod(cnt, pow_mod(K, c));
    cnt = mul_mod(cnt, pow_mod(K-1, N-c));

    if (cnt == R)
        return M;

    return log_mod(pow_mod(K-1, N), mul_mod(R, inv(cnt))) + M;
}

int main () {
    int cas;
    scanf("%d", &cas);
    for (int i = 1; i <= cas; i++) {
        init();
        printf("Case %d: %d\n", i, doit());
    }
    return 0;
}
分享到:
评论

相关推荐

    HP-Socket编译-Linux

    HP-Socket编译-Linux

    JavaScript_生活在Discord上的开源社区列表.zip

    JavaScript

    JavaScript_MultiOn API.zip

    JavaScript

    JavaScript_简单和完整的React DOM测试工具,鼓励良好的测试实践.zip

    JavaScript

    JavaScript_成为一个Nodejs开发者.zip

    JavaScript

    node-v14.5.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    android手机应用源码带文字的ProgressBar Demo源码.rar

    android手机应用源码带文字的ProgressBar Demo源码.rar

    JavaScript_基于Electron和Vuejs的全新跨平台Apple Music体验,从头开始编写,并考虑到性能.zip

    JavaScript

    海信LED32EC290N(0000)BOM1通用LED32K220(0000)BOM1生产用软件数据U盘升级文件.zip

    机型:LED32K220 BOM:1 编号:LED32K220(0000)_C010 方案:MST628 版本号:LED32K220_V0000.30.20A.G0809 U盘升级说明: 就是将下载的程序解压到U盘根目录下,即根目录下有个TargetHis文件夹。 U盘采用FAT32格式,将U盘插在上面那个USB口上(若不行则更换另一个usb口)。 升级方式1: 电视开机后,插入U盘,会弹出提示是否升级,确定即可。 升级方式2: 交流开机瞬间不停的按下、松开home键,然后进入自动升级界面。 新贴片的程序第一次升级可能会在升级进度21%的界面卡住,交流断电再上电即可,继续升级。升级完成后自动启动完成即可(首次开机可能要3分钟)。 升级方式3: 插入U盘,电视上电时在串口打印界面按回车键使开机停止在boot界面,键入cu命令,然后回车即可。

    Python笔记.zip

    Python笔记.zip

    人工智能和智能制造的交汇点

    参考行业研究

    Java输出后序遍历二叉树的代码

    附件是Java输出后序遍历二叉树的代码,后序遍历的顺序是:首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。 TreeNode 类定义了二叉树的节点,BinaryTree 类包含一个 root 属性和 postOrderTraversal 方法。postOrderTraversal 方法递归地遍历二叉树,首先遍历左子树,然后遍历右子树,最后访问当前节点。

    西门子840 x130口设置

    可以通过这个资料 完成西门子840Dsl的x130口采集

    蛋白质耐热温度分类及预测重要数据表.zip

    蛋白质耐热温度分类及预测重要数据表蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

    一个简单的HTML5和CSS代码示例,用于创建一个动态的爱心形状,并在网页上展示一个类似520表白的消息 这个示例使用了CSS的

    520表白html5爱心代码 一个简单的HTML5和CSS代码示例,用于创建一个动态的爱心形状,并在网页上展示一个类似520表白的消息。这个示例使用了CSS的动画效果和HTML的结构。

    node-v16.19.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v15.3.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    海信电视刷机数据 LED32K370(0000)BOM1升级VIDAA2软件数据 务必确认机编一致 强制刷机 整机USB升级程序

    MT5505机芯升级方法: 1、下载数据,压缩包解压,升级软件文件夹名字为Hisense_5505,文件夹下包含“机型名.pkg”以及version.txt 2、将文件夹Hisense_5505,整个文件夹拷贝至U盘根目录下 3、电视关机,插入U盘(USB3或者靠近高频头的USB口),重新启动电视机,电视机自动检测到升级软件之后并进行升级 4、在升级过程中屏幕有相关提示,升级完成后能自动开机。(建议是升级完成之后拔下U盘设备以免下次开机进行重复性升级) 注意: 1、(U盘要求使用FAT32格式,建议4G-8G的品牌U盘,刷机成功率会高) 2、升级到结束,大约需要8-30分钟,中途绝对不能断电 3、升级重启第一次进入系统,请等完全正常进入开机桌面之后,才能拨下U盘 4、如无法升级,将Hisense 5505文件夹内“机型名.pkg”的文件重命名为“upgrade.pkg”,此时插上U盘开机,电视就会默认为强制升级模式

    node-v8.9.4-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    JavaScript_AI拟声 5秒内克隆您的声音并生成任意语音内容

    JavaScript

Global site tag (gtag.js) - Google Analytics