zoukankan      html  css  js  c++  java
  • [CSP-S模拟测试]:chinese(数学)

    题目传送门(内部题25)


    输入格式

    一行三个整数$n,m,k$。


    输出格式

    一行一个整数表示答案。


    样例

    样例输入:

    2 2 2

    样例输出:

    8


    数据范围与提示

    样例解释:

    $f_0=10,f_1=4,f_2=2,f_3=f_4=0$。

    数据范围:

    对于所有数据,$2leqslant n,mleqslant {10}^9,1leqslant kleqslant {10}^6$。


    题解

    考虑$sum limits_{i=0}^{nm}i imes f_i$的意义:所有方案中炼字的个数之和。
    统计答案时可以考虑$[1,k]$每个字对答案的贡献,即每个字在多少种方案中成为炼字。在方格的一个确定位置$(x,y)$,字符$i$对答案的贡献($(x,y)$位置的数是$i$且$i$是炼字的方案数)是${(i−1)}^{n−1}{(i − 1)}^{m−1}k^{nm−n−m+1}$。由于诗作中的所有位置都是等价的,那么最后的答案就是

    $nmsum limits_{i=1}^k {(i−1)}^{n−1} {(i− 1)}^{m−1} k^{nm−n−m+1}$。
    时间复杂度:$Theta(k)$。
    期望得分:$100$分。
    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    long long n,m,k;
    long long ans;
    long long qpow(long long x,long long y)
    {
    	long long res=1;
    	while(y)
    	{
    		if(y&1)res=res*x%1000000007;
    		x=x*x%1000000007;
    		y>>=1;
    	}
    	return res;
    }
    int main()
    {
    	scanf("%lld%lld%lld",&n,&m,&k);
    	for(int i=1;i<=k;i++)ans=(ans+qpow(i-1,n+m-2)*qpow(k,n*m-n-m+1)%1000000007)%1000000007;
    	ans=ans*n%1000000007*m%1000000007;
    	printf("%lld",ans);
    	return 0;
    }
    

    rp++

  • 相关阅读:
    verilog中timescale
    [shell] if语句用法
    makefile编写
    linux下压缩解压缩命令
    python获取文件所在目录
    gvim 技巧
    vcs编译verilog/sysverilog并执行
    verilog中signed的使用
    [leetcode]_String to Integer (atoi)
    [leetcode]_Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/wzc521/p/11468631.html
Copyright © 2011-2022 走看看