聪聪考试

2016.1.26


试题描述

聪聪是一个善良可爱、睿智聪慧的好孩子。聪聪是100%的学霸,这一天她在考数学。聪聪很快做到了最后一道题:“高一八班有n个人,从1到n编号,一次互判作业时,老师随机将作业发到这n个人手中。已知有k个人拿到的不是自己的作业,那么请问有多少种情况符合条件呢?”这么简单的问题聪聪当然会做了,她想考考你,你能不能比她先给出问题的答案呢?


输入

共1行,包含2个整数n和k。

输出

共1行,包含1个整数,表示答案。由于答案可能很大,请输出答案模10007的余数。

输入示例

4 3

输出示例

8

其他说明

对于30%的数据,0≤k≤n≤10。
另有10%的数据,k=0。
另有10%的数据,k=1。
对于70%的数据,0≤k≤n≤10000。
对于100%的数据,0≤k≤1000000,1≤n≤1000000000。

C(n,k)*f[k],其中f[k]表示全错排列第k项。

关键是组合数取模

在函数C中若b>a则直接返回0!(因为这是定义)

把我坑了半天!

所以得出一个很牛x的结论!

C(a,b)模p不等于0的充要条件是a在p进制下的每一位都不小于b在p进制下对应的位,C(a,b)模p等于0的充要条件是a在p进制下至少有一位小于b在p进制下对应的位!

或者上面那句话不好理解的话也没关系,反正没什么卵用,写代码的时候不要忘了判定就好。

AC代码:

#include<iostream>
using namespace std;
const int mod=10007;
int n,k,f[1000005];
int ans=1;

int qpow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1) (ret*=a)%=mod;
        b/=2;
        (a*=a)%=mod;
    }
    return ret;
}

int C(int a,int b)
{
    if(b>a) return 0;
    if(a-b<b) b=a-b;
    int s1=1,s2=1;
    for(int i=1;i<=b;i++)
    {
        (s1*=i)%=mod;
        (s2*=(a-i+1))%=mod;
    }
    return (s2*qpow(s1,mod-2))%mod;
}

void Lucas(int a,int b)
{
    if(!a||!b) return ;
    Lucas(a/mod,b/mod);
    (ans*=C(a%mod,b%mod))%=mod;
}
int main()
{
    scanf("%d%d",&n,&k);
    Lucas(n,k);
    f[0]=f[2]=1;
    for(int i=3;i<=k;i++)
    {
        f[i]=( ((i-1)%mod) * ((f[i-1]+f[i-2])%mod) )%mod;
    }
    if(k>n) cout<<0;
    else printf("%d",ans*f[k]%mod);
}

时间: 2024-10-19 21:23:49

聪聪考试的相关文章

[BZOJ 2152]聪聪可可

Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所

Bzoj1415 [Noi2005]聪聪和可可

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1586  Solved: 929 Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输

【BZOJ2152】聪聪可可

第二次学树分治,好像又没学会-- 原题: 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数

cogs 2320. [HZOI 2015]聪聪的世界题解

2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1-an,完成以下操作: 1  x 询问从x向左数第一个<ax的数: 2  x 询问从x向左数第一个>ax的数: 3  x 询问从x向右数第一个<ax的数: 4  x 询问从x向右数第一个>ax的数: 5  x y 交换ax与ay: 6  x y w 给ax-ay加上w: 7  x y w 给ax-a

聪聪和可可

  Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连. Output 输出1个实数,四舍五入保

BZOJ 1415 NOI2005 聪聪和可可 期望DP+记忆化搜索 BZOJ200题达成&amp;&amp;NOI2005全AC达成

题目大意:给定一个无向图,聪聪在起点,可可在终点,每个时刻聪聪会沿最短路走向可可两步(如果有多条最短路走编号最小的点),然后可可会等概率向周围走或不动,求平均多少个时刻后聪聪和可可相遇 今天早上起床发现194了然后就各种刷--当我发现199的时候我决定把第200题交给05年NOI仅剩的一道题--结果尼玛调了能有一个小时--我居然没看到编号最小这个限制0.0 首先我们知道,由于聪聪走两步而可可走一步,所以聪聪一定能在有限的时刻追上可可,而且两人的距离随着时间进行单调递减 于是我们记忆化搜索 首先用

bzoj 2152: 聪聪可可 树的点分治

2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 485  Solved: 251[Submit][Status] Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“

[BZOJ 2152]聪聪可可(点分治)

Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所

【NOI2005】 聪聪可可

树分治劲啊 原题: 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数.接下来由聪聪和可可分