问题标题: 酷町堂:1520 多个组合数 40分,求大佬帮忙!

0
0
已解决
栾峻岩
栾峻岩
初级天翼
初级天翼
#include <iostream>
using namespace std;
long long int a[1000000],b[1000000];
long long int bisu(int x,int y)
{
    int a,b=x,z=0;
    long long int sum=1,num=1;
    if (x==y)
    {
        return 1; 
    }
    else
    {
        for (int i=1;i<=y;i++)
        {
            if (z>y)  
                break;
            else
            {
                z++;
                sum*=b;
                b--;
            }
        }
        for (int i=1;i<=y;i++)
            num*=i;
        sum/=num;
        sum%=10007;
        return sum;
    }
}
int main()
{
    int n;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
        cout<<bisu(a[i],b[i])<<endl;
    }
    return 0;
}
//这是代码,40分代码。

题目在这求各位大佬帮忙!谢谢!

题目:

1520   多个组合数

题目描述 Description

有N个任务,每个任务是求一个组合数。

输入描述 Input Description

第一行输入一个正整数N<1000000;第2到第N+1行,每行2个正整数x和y,表示要计算组合数C(x,y),保证x>=y, x<1000。

输出描述 Output Description

N行,每行一个组合数C(x,y),由于答案可能很大,输出答案模10007的结果。

样例输入 Sample Input


 

3
6 3
10 7
20 8

样例输出 Sample Output


 

20
120
5886

 

 

栾峻岩在2018-09-29 16:53:55追加了内容

改了之后80分(用杨辉三角预处理再输出)

#include <iostream>
using namespace std;
long long int yh[1010][1010];
int main()
{
    int n;
    cin>>n;
    yh[1][1]=1;
    yh[2][1]=1;
    yh[2][2]=1;
    for (int i=3;i<=1000;i++)
    {
        for (int j=1;j<=i;j++)
        {
            yh[i][j]=(yh[i-1][j]+yh[i-1][j-1])%10007;
        }
    }
    for (int i=1;i<=n;i++)
    {
        int x,y;
        cin>>x>>y;
        cout<<yh[x+1][y+1]<<endl;
    }
    return 0;
}

 


3
已采纳
陆麟瑞
陆麟瑞
资深天翼
资深天翼

求组合数不要先把x和y都先求出来在除,要一边乘一边除。

0
赵逸凡
赵逸凡
初级启示者
初级启示者

@徐铭凯 徐天才不要侮辱人家,可能他们正在做那些SSD算法呢,或者是什么2-SAT和传说中的四维数组。

这貌似是一道国外的题或NOI,mod10007好像在哪见过。

看这位大佬的写法,RE好像要高精度或者优化算法

组合数我听不懂,但是输入建议用scanf或者指针字符串(高精度)输入,mod10007也可以用什么高级除法思路(好像是四舍五入的规律)优化一下,例如取10007的因数找规律,如果按陆巨佬的思路来看,我就听不懂了。

0
0
0
0
0
0
0
夏卓然
夏卓然
初级守护
初级守护

好难啊!!!!!!!!!!!!!

0
我要回答