WA...

//组合数取模
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

const int MaxM = 10 + 5, MaxPi = 100000 + 5;

int n, m, Top;
int W[MaxM], Ci[MaxPi], Pi[MaxPi], Phi[MaxPi], PiCi[MaxPi]; 

typedef long long LL;

LL P, Q, Ans, Sum;
LL f[MaxPi], MI[MaxPi], PI[MaxPi];;

LL Pow(LL a, LL b, LL Mod) {
	a %= Mod; b %= Mod;
	LL ret = 1, f = a;
	while (b) {
		if (b & 1) {
			ret *= f;
			ret %= Mod;
		}
		b >>= 1;
		f *= f;
		f %= Mod;
	}
	return ret;
}

struct ES
{
	LL u, t;
};

ES Solve(int num, int Pi_e, int PiCi_e) {
	ES ret;
	ret.u = 0;
	ret.t = 1;
	while (num) {
		ret.u += num / Pi_e;
		ret.t *= Pow(f[PiCi_e - 1], num / PiCi_e, PiCi_e);
		ret.t %= PiCi_e;
		ret.t *= f[num % PiCi_e];
		ret.t %= PiCi_e;
		num /= Pi_e;
	}
	return ret;
}

LL C1(int a, int b, int Pi_e, int PiCi_e, int Phi_e) {
	f[0] = 1; f[1] = 1;
	for (int i = 2; i <= PiCi_e - 1; i++) {
		if (i % Pi_e == 0) f[i] = f[i - 1];
		else f[i] = f[i - 1] * i % PiCi_e;
	}
	LL ret, uu, t1, t2, t3;
	ES e1, e2, e3;
	e1 = Solve(a, Pi_e, PiCi_e);
	e2 = Solve(a - b, Pi_e, PiCi_e);
	e3 = Solve(b, Pi_e, PiCi_e);
	uu = e1.u - (e2.u + e3.u);
	t1 = e1.t; t2 = e2.t; t3 = e3.t;
	ret = Pow(Pi_e, uu, PiCi_e);
	ret *= t1; ret %= PiCi_e;
	ret *= Pow(t2, Phi_e - 1, PiCi_e); ret %= PiCi_e;
	ret *= Pow(t3, Phi_e - 1, PiCi_e); ret %= PiCi_e;
	return ret;
}

LL C2(int a, int b) {
	LL ret;
	ret = 0;
	for (int i = 1; i <= Top; i++) {
		ret += (C1(a, b, Pi[i], PiCi[i], Phi[i]) * ((MI[i] * PI[i]) % P)) % P;
		ret %= P;
	}
	return ret;
}

int main()
{
	cin >> P >> n >> m;
	Sum = 0;
	for (int i = 1; i <= m; i++) {
		scanf("%d", &W[i]);
		Sum += (LL)W[i];
	}
	if (Sum > n) {
		printf("Impossible\n");
		return 0;
	}
	Top = 0;
	Q = P;
	int SQRTQ = (int)sqrt(Q * 1.0);
	for (int i = 2; i <= SQRTQ; i++) {
		if (Q % i != 0) continue;
		Pi[++Top] = i;
		PiCi[Top] = 1;
		Ci[Top] = 0;
		while (Q % i == 0) {
			++Ci[Top];
			PiCi[Top] *= i;
			Q /= i;
		}
		Phi[Top] = PiCi[Top] / i * (i - 1);
		MI[Top] = P / PiCi[Top];
		PI[Top] = Pow(MI[Top], Phi[Top] - 1, PiCi[Top]);
	}
	if (Q > 1) {
		Pi[++Top] = Q;
		PiCi[Top] = Q;
		Ci[Top] = 1;
		Phi[Top] = Q - 1;
		MI[Top] = P / PiCi[Top];
		PI[Top] = Pow(MI[Top], Phi[Top] - 1, PiCi[Top]);
	}
	Ans = 1;
	for (int i = 1; i <= m; i++) {
		Ans *= C2(n, W[i]);
		Ans %= P;
		n -= W[i];
	}
	cout << Ans << endl;
//	printf("%I64d\n", C2(n, m));
	return 0;
}

  

时间: 2024-10-19 05:30:38

WA...的相关文章

hdu 4891---水题 但是WA了很多次

这道题的坑在----过程中即使使用long  long 也会超出范围 自己看了很久读了很多遍题还是没想到 记得当时的想法是----反正我用了long long 已经是最大的范围了,肯定没法用更大的类型--即使unsigned也只是 比long long 大一倍,现在回头看,这种想法太唯心,不是理性分析的结果啊,, 代码: //1005 #include <cstdio> #include <cstring> #include <algorithm> #include &

POJ1905 expanding rods 【水二分+谜之WA】

一道很水的题,就是不知道为什么wa,,, 其实小优那个精度控制循环控制二分的方法不算好,如果esp太小,会TLE,直接人工控制次数最好了 #include <cstdio> #include <cmath> #include <iostream> using namespace std; double getres(double r,double s,double l) { //cout<<(r-s/acos(1-l*l/(2.0*r*r)))<<

传染病控制(洛谷 1041 WA 90)

题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群.于是,蓬莱国的疾病控制中心决定采取切断传播途径的方法控制疾病传播.经过 WHO(世界卫生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究清楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法. 题目描述 研究表明,这种传染病的

NYOJ-求逆序数 ----------------待解决,WA

描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出它的逆序数是多少. 比如 1 3 2 的逆序数就是1. 输入 第一行输入一个整数T表示测试数据的组数(1<=T<=5)每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素. 数据保

通信基站(为毛wa)

Description Input Output Sample Input 2 2 1 1 0 0 4 4 3 100 1 0 0 1 1 500 500 Sample Output 2.00 201.41 题解:用容斥的方法,选出所有情况,对于每选的数,找别的点到已经选的点的最短距离与R的乘积:加上,找最小值: 但是一直wa,为毛,思路感觉也没错: 代码: #include<cstdio> #include<iostream> #include<cmath> #inc

Labeling Balls(拓扑排序wa)

Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12466   Accepted: 3576 Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that: No two balls share

poj 3164 最小树形图模板 (优先c++ ,g++ 有时会wa==)

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include <iostream> #define eps 1e-8 using namespace std; /* 最小树形图图模版-朱刘算法 模版说明:点标号必须0-(N-1) 必须去除到自身的点(到自身的边的边权赋无限大) */ #define M 109 #define type double

UVa816,Ordering Tasks,WA

#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace std; const char*dirs="NESW"; const char*turns="FLR&

台州OJ 3709: Number Maze (数组越界不报RE,报WA坑爹)

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3709 You are playing one game called "Number Maze". The map of an example is shown in the following figure. In the map, there are N*N+2 cells. When the game starts, you

UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。

题意:给一个由n*m个正方形格子组成的矩形,其中每个格子的边都是可以走的,长度给定,规定:如果在进入该路前需要拐弯,或者走完该路需要拐弯,都是需要付出双倍距离的(每条路最多算2倍).问从起点到终点的最短路经长. 思路:这个题目超级难搞,思路很简单,就是很麻烦!!!我将1个点4个方向的路长都记录下来,然后进行最短路,只要一个点的某个方向更新了,就进队.所有都考虑得差不多了,就是WA... 步骤 : (1)起点不进队,因为起点出发都需要双倍,况且,如果起点路长为0的话,其他点就不能路过起点了,所以将