CRB and Candies
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 947 Accepted Submission(s): 442
Problem Description
CRB has
N
different candies. He is going to eat
K
candies.
He wonders how many combinations he can select.
Can you answer his question for all K (0 ≤ K ≤ N )?
CRB is too hungry to check all of your answers one by one, so he only asks least common multiple(LCM) of all answers.
He wonders how many combinations he can select.
Can you answer his question for all K (0 ≤ K ≤ N )?
CRB is too hungry to check all of your answers one by one, so he only asks least common multiple(LCM) of all answers.
Input
There are multiple test cases. The first line of input contains an integer
T
, indicating the number of test cases. For each test case there is one line containing a single integer
N
.
1 ≤ T ≤ 300
1 ≤ N ≤ 106
1 ≤ T ≤ 300
1 ≤ N ≤ 106
Output
For each test case, output a single integer – LCM modulo 1000000007(
109+7
).
Sample Input
5 1 2 3 4 5
Sample Output
1 2 3 12 10
思路:我也不知道怎么来的公式反正直接用就是了。证明过程来自 http://arxiv.org/pdf/0906.2295v2.pdf 因为是英文的能看懂就看吧
结论就是:
令
an=LCM(C(n,0),C(n,1),C(n,2),...,C(n,n))
bn=LCM(1,2,3,...,n)
an=bn+1n+1
if (n=pk)bn=p∗bn−1elsebn=bn−1
所以用素数筛选求出所有n可由单个质因子累乘的数即可。然后用欧拉定理或者乘法逆元求n+1的逆元
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 1000100
#define LL long long
LL mod=1000000007;
LL notprime[N],prime[N];
LL dp[N];
void init()
{
for(LL i=2; i*i<N; i++)
{
if(!notprime[i])
{
for(LL j=i; j<N; j*=i)
prime[j]=i;
for(LL j=i*i; j<N; j+=i)
notprime[j]=1;
}
}
dp[1]=1;
for(int i=2; i<=N; i++)
if(prime[i])
dp[i]=dp[i-1]*prime[i]%mod;
else if(!notprime[i]) dp[i]=dp[i-1]*i%mod;
else dp[i]=dp[i-1];
}
LL pow_mod(LL a,LL n)
{
LL ans=1;
while(n)
{
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
LL inv(LL n)
{
return pow_mod(n,mod-2);
}
int main()
{
int T;
LL n;
init();
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
LL ans=dp[n+1]*inv(n+1)%mod;
printf("%lld\n",ans);
}
return 0;
}
CRB糖果组合问题
本文介绍了一种解决CRB糖果组合问题的有效算法,该问题要求计算所有可能的糖果组合数目的最小公倍数。通过使用质数筛选和欧拉定理,文章提供了一个简洁高效的解决方案。
&spm=1001.2101.3001.5002&articleId=51660126&d=1&t=3&u=457956a2922c4deaa8bc75bee16b67e4)
453

被折叠的 条评论
为什么被折叠?



