2016 百度之星资格赛

A

前缀的积可以求出来  然后 z[b]/z[a-1]   就是要求的   求一下 z[a-1]的逆元   m为素数 可以用费马小定理

#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<queue>

using namespace std;

#define LL   __int64
#define MAXN 200010
#define inf  1000000000

char z[MAXN];
int  sum[MAXN];

int quick(int a,int b,int c)
{
    int ans=1;
    a=a%c;
    while(b>0)
    {
        if(b%2==1)
            ans = (ans *a)%c;
        b>>=1;
        a = (a*a)%c;
    }
    return ans;
}
int main()
{
    int n;
    int m=9973;

    while(scanf("%d",&n)!=EOF)
    {
        scanf("%s",z+1);
        int len=0;
        for(int i=1;z[i];i++)
            len++;
        sum[0]=1;
        for(int i=1;i<=len;i++)
            sum[i]=(sum[i-1]*(z[i]-28))%m;

        for(int i=1;i<=n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            int nia =quick(sum[a-1],m-2,m);
            printf("%d
",(sum[b]*nia)%m);
        }
    }
    return 0;
}

B  斐波那契数列  果断Java

import java.math.*;
import java.util.*;
import java.lang.*;

public class Main {

    public  static void main(String argc[])
    {
        Scanner x =new Scanner(System.in);
        
        BigInteger z[]= new BigInteger [205];
        int c=1;
        z[0]=BigInteger.valueOf(c);
        z[1]=BigInteger.valueOf(c);
        for(int i=2;i<=200;i++)
        {
            z[i]=BigInteger.ZERO;
            z[i]=z[i].add(z[i-2]);
            z[i]=z[i].add(z[i-1]);
        }
        
        while(x.hasNext())
        {
            int a=x.nextInt();
            System.out.println(z[a]);
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/cherryMJY/p/6580767.html