解决谷歌Kickstart 2018轮c Q3

时间:2018-05-27 14:58:27

标签: c++ algorithm

我是本次比赛的新手,这是第一次参加比赛。我有两个问题要问。

  1. 我下载了输入,它有aa.in格式(我从未见过这种格式:p)。那么我应该以aa.out格式输出,还是只能使用aa.txt格式?如果我需要制作aa.out格式,那么我该如何制作呢?只需使用>重定向即可aa.out?

  2. 我试图解决这个问题(https://code.google.com/codejam/contest/dashboard?c=4384486#s=p2)并且它适用于示例案例,但是当我提交时它不正确。在一开始,它显示了一些不应该发生的情况的负数。因此,我通过将int转换为long long并调整了一些模块化来调试它。但是,当我不知道为什么时,我仍然无法得到答案。因此,我需要一些帮助来弄清楚这里出了什么问题。如果你给我一个提示,那将非常有帮助!

  3. #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    void makeFullArray(unsigned long long * full, unsigned long long arrlen, unsigned long long x1, unsigned long long y1, unsigned long long C, unsigned long long D, unsigned long long E1, unsigned long long E2, unsigned long long F)
    {
        unsigned long long  prevx = x1;
        unsigned long long prevy = y1;
        unsigned long long  x, y;
        for (unsigned long long i = 2; i <= arrlen; i++)
        {
            x = (C * prevx + D * prevy + E1) % F;
            y = (D * prevx + C * prevy + E2) % F;
            full[i] = (x + y) % F;
            prevx = x; 
            prevy = y;
        }
    }
    
    unsigned long long exponential(unsigned long long base, unsigned long long exp)
    {
    
        unsigned long long res = 1;
        while (exp)
        {
            if (exp & 1)
                res *= base;
            exp >>= 1;
            base *= base;
        }
        return res;// (res % (1000000000 + 7));
    }
    
    void getexponential(unsigned long long  * temp, unsigned long long cnt, unsigned long long * result, unsigned long long K, unsigned long long n)
    {
        unsigned long long mod = 1000000007;
        for (unsigned long long j = 1; j <= K; j++)
        {
            for (unsigned long long i = 0; i < cnt; i++)
            {
    
                result[j] += ((temp[i] * exponential(i + 1, j)) % mod);
    
    
            }
        }
    
        printResult(result, K);
    }
    
    void calculate(unsigned long long n, unsigned long long * full,  unsigned long long * result, unsigned long long K)
    {
    
        for (unsigned long long i = 1; i <= n; i++)
        {
            unsigned long long multiplier = i;
            unsigned long long cnt = 0;
            unsigned long long temp[102] = { 0 };
            for (unsigned long long j = 1; j < n; j++)
            {
    
                temp[cnt] = full[j];
                cnt++;
    
                if (cnt == multiplier)
                {
                    //cout << cnt << "  -- " << endl;
    
                    getexponential(temp, cnt, result, K, n); 
    
                    j = j - cnt + 1;
                    if (n - j < multiplier)
                        break;
    
                    cnt = 0;
    
                }
            }
        }
    
    }
    
    unsigned long long getsum(unsigned long long * result, unsigned long long K)
    {
        unsigned long long tmp = 0;
        unsigned long long mod = 1000000007;
        for (unsigned long long i = 1; i <= K; i++)
        {
            tmp += (result[i] % (mod));
            tmp %= mod;
        }
    
        return tmp;
    }
    
    int main(void)
    {
        int TC;
        scanf_s("%d", &TC);
        for (int i = 1; i <= TC; i++)
        {
            unsigned long long N, K, x1, y1, C, D, E1, E2, F;
            scanf_s("%llu %llu %llu %llu %llu %llu %llu %llu %llu", &N, &K, &x1, &y1, &C, &D, &E1, &E2, &F);
    
            unsigned long long full[101]; 
            unsigned long long result[21] = { 0 }; 
    
            full[1] = (x1 + y1)%F;
    
            // figure out the given array A
            makeFullArray(full, N, x1, y1, C, D, E1, E2, F);
            // calculate for each exponential power
            calculate(N+1, full, result, K);
            // sum over the range K to get the answer
            unsigned long long tot = getsum(result, K);
            cout << "Case #" << i << ": " << (tot%(1000000007L)) << endl;
        }
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

您可以下载其他参赛者的答案并在相同的输入上运行,并查看答案的不同之处。这可能会给你一些线索。