解决谷歌启动2018年第三季度的启动问题



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

  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 并放置一些模块化来调试它以不拥有它们。但是,我仍然无法得到答案,而我不知道为什么。因此,我需要一些帮助来弄清楚这里出了什么问题。如果你给我一个提示,这将是非常有帮助的!

#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;
}

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

最新更新