fzu - 2164 Jason's problem
生活随笔
收集整理的這篇文章主要介紹了
fzu - 2164 Jason's problem
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:就是把n的階乘轉化b進制后綴為0的個數為k,求b的個數(n/k < 500)
題解:把n的階乘分解素因子,枚舉前500個素因子即可,找出素因子的個數大于k的
然后就是求符合條件的素因子的組合有多少種;
#include<stdio.h> #include<math.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; typedef __int64 LL; const LL mod = 1000000007; LL prime[1000]; LL vis[10005]; LL a[1000]; LL b[1000]; LL num; void init() {num = 0;memset(vis,0,sizeof(vis));for(LL i = 2; i <= 6000; i++){if(!vis[i]){prime[num++] = i;for(LL j = i+i; j <= 6000; j+=i){vis[j] = 1;}}}} int main() {init();int T;LL n,k,tmp;scanf("%d",&T);while(T--){scanf("%I64d%I64d",&n,&k);LL p = 0,i;LL ans = 1,ans1 = 1,Sum = 0; ;for(i = 0; i < num; i ++){tmp = n;LL sum = 0;while(tmp){tmp/=prime[i];sum += tmp;}if(sum >= k){LL ss = sum/k+1;ans = (ans * ss)%mod;a[i] = ss - 1;b[i] = sum;}else break;}for(LL j = 0; j < i; j++){LL count = 0;for(LL r = 1; r <= a[j]; r++)if(b[j]/r!=k) count++;ans1 = (ans1 * (count+1))%mod;}printf("%I64d\n",((ans-ans1)%mod+mod)%mod);} }總結
以上是生活随笔為你收集整理的fzu - 2164 Jason's problem的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JimuReport积木报表,一个好用的
- 下一篇: 区块链技术,起飞!