标签:des style blog http color os io ar strong
Mean:
给你两个数n和p,现在要你从n中选出m个数,如果n取m能够被p整除,那么为可行方案,问可行方案数有多少种。
analyse:
如果数据小的话确实是道水题,当然只要想到这个方法,一样也是水题。
如果我们用传统的方法:枚举m,然后求c(n,m),再看能不能被p整除这样暴力来做的话,光是c(n,m)就存不下,更别提判断整除了。
这题用了一个巧妙的方法,由于题目说p是一个素数,那么我们可直接来统计c(n,m)分子分母的素因子,然后相减之后就是c(n,m)的p因子了。
Time complexity:O(n)
Source code:
// Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-09-09-20.25 #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack> #include<map> #include<string> #include<climits> #include<cmath> #define N 1000010 #define LL long long using namespace std; int main() { // freopen("C:\\Users\\ASUS\\Desktop\\cin.cpp","r",stdin); // freopen("C:\\Users\\ASUS\\Desktop\\cout.cpp","w",stdout); long long n,p; while(~scanf("%I64d %I64d",&n,&p)) { if(!n||p>n) { puts("Where is hero from?"); continue; } long long tmp,cnt,m,ans; ans=cnt=0; for(m=1;m<=n/2;m++) { tmp=n-m+1; while(!(tmp%p)) { cnt++; tmp/=p; } tmp=m; while(!(tmp%p)) { cnt--; tmp/=p; } if(cnt<=0) continue; if(m*2==n) ans++; else ans+=2; } if(ans) cout<<ans<<endl; else puts("Where is hero from?"); } return 0; }
数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!
标签:des style blog http color os io ar strong
原文地址:http://www.cnblogs.com/acmer-jsb/p/3963441.html