POJ 1091

这题确实是好。

其实是求x1*a1+x2*a2+....M*xn+1=1有解的条件。很明显,就是(a1,a2,...M)=1了。然后,可以想象,直接求有多少种,很难,所以,求出选择哪些数一起会不与M互质。。。好吧,思路就到这里了。。。T_T

经过人提示,若(a1,a2,,,,an)与M不互质,则最大公约数中必定包含M中的质数。啊,愰然大悟,这不是显而易见的吗?为什么我想不到?

所以,先求出M包含哪些质数,那么,选出其中一些包含该质数的数组成数列不就好了?这很容易就能想到容斥原理了,因为选出一些数,使它具有性质P1,又选出另一些集合使它具有P2,P3....,最终求至少包含一个性质的集合。

那么,能被1~M中能被P1整除的个数为【M/p1】,以此类推。。。

由容斥原理公式

如此,从M^N中减去就可以了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#define LL __int64
using namespace std;

LL prime[50],l;
LL n,m;

LL Power(LL m,LL n){
	LL ret=1;
	for(int i=1;i<=n;i++){
		ret=ret*m;
	}
	return ret;
}

void wprime(LL m){
	if(m%2==0){
		prime[l++]=2;
		while(m%2==0)
		m/=2;
	}
	for(LL i=3;i*i<=m;i+=2)
	if(m%i==0){
		prime[l++]=i;
		while(m%i==0)
		m/=i;
	}
	if(m>1)
	prime[l++]=m;
}

void Nest(LL p, LL re, LL c,LL &res){
	if(c==0){
		//	cout<<re<<endl;
			res+=Power(m/re,n);
		return ;
	}
	else{
		for(LL i=p;i<l;i++){
			Nest(i+1,re*prime[i],c-1,res);
		}
	}
}

LL work(LL c){
	LL res=0;
	for(LL i=0;i<l;i++){
		Nest(i+1,prime[i],c-1,res);
	}
	return res;
}

int main(){
	while(scanf("%I64d%I64d",&n,&m)!=EOF){
		l=0;
		LL al=Power(m,n);
		wprime(m);
		LL c=1;
		for(LL i=1;i<=l;i++){
			c*=-1;
			LL res=work(i);
			al+=(c*res);
		}
		printf("%I64d\n",al);
	}
	return 0;
}
时间: 2024-10-09 10:13:27

POJ 1091的相关文章

poj 1091 跳骚

1 /** 2 题意: 求对于小于m的n个数, 求x1*a1 + x2*a2+x3*a3........+xn*an = 1 3 即求 a1,a2,a3,....an 的最大公约数为1 , a1,a2....an 可重复 4 原理 : 容斥原理 所有的 排序即 m^n --不符合的情况 ,即为所求 5 不符合的情况: 就是 这n个数有最大公约数 不是1, 即这n个数是m 的素因子的组合.. 6 一共有 m^n张卡片,如果减去其中含有公约数的卡片剩下的就是所求的结果 7 举个例子 n=2, m=3

POJ 1091 容斥原理

链接: http://poj.org/problem?id=1091 题意: 给你两个正整数n,m,让你求长度为n+1的满足条件的一个等式:a[1]*x1+a[2]*x2+a[3]*x3+...+a[n]*xn+a[n+1]*x(n+1)=1 (0<=a[i]<=m&&a[n+1]=m) 让你求一共有多少种情况满足这个条件. 要使得 a[1]*x1+a[2]*x2+a[3]*x3+...+a[n]*xn+a[n+1]*m=1 (0<=a[i]<=m),那么a[1],

POJ 1091 跳蚤(分解质因数 + 容斥 + 大数)

跳蚤 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8910   Accepted: 2676 Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字.跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向

poj 1091 解多元不定方程

跳蚤 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9225   Accepted: 2762 Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字.跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向

POJ 1091 跳蚤

   Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9914   Accepted: 3032 Description Z 城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤 发一张卡片.卡片上写有N+1个自然数.其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字.跳蚤每次可以从卡片上任意选择一个自然数S, 然后向左

ACM 容斥原理

VJ 点击打开链接 参考 点击打开链接 非常好的译文:点击打开链接 容斥原理的想法就是求多个集合的并集.所以要先设计好集合. 组合数学问题中,正面解决会困难,常用方法是正难则反,使用容斥原理求反向在用全集减去.将对立面的限制条件分析清楚. eg 求区间互质的数的个数,则用除法等计算出一个数的倍数的方法再减去. UVa 11806 Cheerleaders 求k个石子放在n*m的矩阵里 并且第一行 最后一行 第一列 最后一列都要有石子 考虑反面 求出所有的 减去不满足的情况 容斥原理总共4个 集合

POJ 3449 Geometric Shapes --计算几何,线段相交

题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一步来吧. 还有收集了一个线段旋转的函数. Vector Rotate(Point P,Vector A,double rad){ //以P为基准点把向量A旋转rad return Vector(P.x+A.x*cos(rad)-A.y*sin(rad),P.y+A.x*sin(rad)+A.y*co

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive