csu 1233 病毒的复制
/* WA,对测试示例结果正确,不解 */
已通过,原因是%I64d的使用不符合编译器的要求,百度了一下,这个问题早就有了……
非常感谢Staginner大牛的帮助!
变量定义 | 输出方式 | gcc(mingw32) | g++(mingw32) | gcc(linux i386) | g++(linux i386) | MicrosoftVisual C++ 6.0 |
---|---|---|---|---|---|---|
long long | “%lld” | 错误 | 错误 | 正确 | 正确 | 无法编译 |
long long | “%I64d” | 正确 | 正确 | 错误 | 错误 | 无法编译 |
__int64 | “lld” | 错误 | 错误 | 无法编译 | 无法编译 | 错误 |
__int64 | “%I64d” | 正确 | 正确 | 无法编译 | 无法编译 | 正确 |
long long | cout | 非C++ | 正确 | 非C++ | 正确 | 无法编译 |
__int64 | cout | 非C++ | 正确 | 非C++ | 无法编译 | 无法编译 |
long long | printint64() | 正确 | 正确 | 正确 | 正确 | 无法编译 |
(以上表格来自C/C++的64位整型 不同编译器间的比较(原上草),详见该文)
我的第一道矩阵幂乘,表示二进制给人确实能带来很多启发。。
/* csu 1233 */
# include <stdio.h>
# define MAX 1000003
typedef struct Matrix
{
long long a,b;
long long c,d;
} matrix;
long long x[2], t;
int solve(matrix mat)
{
int tot; /* 原为int tot, i;CE了,提示:i定义了但未使用。真是强大啊!我用的CB没有提示这个*/
matrix cur, cross, tmp;
cur = mat;
if (t & 0x1) cross = cur;
else
{
cross.a = cross.d = 1;
cross.b = cross.c = 0;
}
while (t>0)
{
t >>= 1;
// cur = cur L* cur; err: 变量值变化了
tmp = cur;
cur.a = (tmp.a*tmp.a+tmp.b*tmp.c) % MAX;
cur.b = (tmp.b*(tmp.a+tmp.d)) % MAX;
cur.c = (tmp.c*(tmp.a+tmp.d)) % MAX;
cur.d = (tmp.d*tmp.d+tmp.b*tmp.c) % MAX;
// cross = cross L* cur;
tmp = cross;
if (t & 0x1)
{
cross.a = (tmp.a*cur.a+tmp.b*cur.c) % MAX;
cross.b = (tmp.a*cur.b+tmp.b*cur.d) % MAX;
cross.c = (tmp.c*cur.a+tmp.d*cur.c) % MAX;
cross.d = (tmp.c*cur.b+tmp.d*cur.d) % MAX;
}
}
tot = (int)((cross.a*x[0]+cross.b*x[1]+cross.c*x[0]+cross.d*x[1])%MAX);
return tot;
}
int main()
{
int tot;
matrix mat;
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
while (~scanf("%Illd%lld%lld%lld%lld%lld%lld", &x[0],&x[1],&mat.a,&mat.c,&mat.b,&mat.d,&t))
/*
原为 while(~scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d",...
*/
{
tot = solve(mat);
printf("%d\n", tot);
}
return 0;
}