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



原文地址:https://www.cnblogs.com/JMDWQ/p/2367363.html