s = 1 % m + ((i % m) * (s % m)) % m;考虑到(i * s) % m == ((i % m) * (s % m)) % m;
这么改之后,不会出现溢出。
而原来s = (1+i*s)%m这个在计算i * s的时候,由于i最大可以为10e100 - 1,而s最大可以是m-1,所以
计算时会出错,出现溢出情况。
感谢Ryan的热情帮助,我总算明白这些细节了!
//***********************************************************
//cout << "n = " << n << endl;
long long s = 1;
for (i = n; i >= 1; i--)
{
//s = (1 + i * s) % m;
s = 1 % m + ((i % m) * (s % m)) % m;
s %= m;
}
s %= m;
cout << s << endl;
}
//***********************************************************
//cout << "n = " << n << endl;
long long s = 1;
for (i = n; i >= 1; i--)
{
//s = (1 + i * s) % m;
s = 1 % m + ((i % m) * (s % m)) % m;
s %= m;
}
s %= m;
cout << s << endl;
}
#define MAX_LEN 1000001
int main()
{
long m;
long n = 0;
char ch[MAX_LEN];
int testNum, i;
cin >> testNum;
for (int test = 1; test <= testNum; test++)
{
scanf("%s %ld", ch, &m);
//***************确定n的值*********************************
for (i = 0; ch[i] != '\0'; i++)
;
int len = i;
//cout << "ch =" << ch << endl;
// cout << "len = " << len << endl;
if (len >= 7)
{
n = m-1;
}
else
{
int k = 1;
n = ch[len-1]-'0';
for (int j = len-2; j >= 0; --j)
{
n += (ch[j] - '0') * pow(10, k);
k ++;
if (n >= m)
{
n = m-1;
break;
}
}
}
//***********************************************************
cout << "n = " << n << endl;
long s = 1;
for (i = n; i >= 1; i--)
{
s = (1 + i * s) % m;
s %= m;
}
s %= m;
cout << s << endl;
}
从题目分析看 这道题首先有两个不确定的参数 n 和 m ,而且两者都有个数值范围,n的数值范围[0,10的100次方),m的值范围(0,1000000), 计算机的最长的long double 数据类型的范围不够存n ,所以不可能达到10的100次方,而且分析得出题目所求结果值必然在(1,999998]范围的数值,
给一个方案做个循环for( i = 1, i < 计算机能存的数的最大范围的值,i++) 将n范围值的所有的结果计算出来,存放到记事本中,你自己可以观察,这个结果肯定跟数m有关系,而且可能磁盘不晓得能存下这结果么。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAX_LEN 1000001
int main()
{
long m;
long n = 0;
char ch[MAX_LEN];
int testNum, i;
cin >> testNum;
for (int test = 1; test <= testNum; test++)
{
scanf("%s %ld", ch, &m);
//***************确定n的值*********************************
for (i = 0; ch[i] != '\0'; i++)
;
int len = i;
// cout << "ch =" << ch << endl;
// cout << "len = " << len << endl;
if (len >= 7)
{
n = m-1;
}
else
{
int k = 1;
n = ch[len-1]-'0';
for (int j = len-2; j >= 0; --j)
{
n += (ch[j] - '0') * pow(10, k);
k ++;
if (n >= m)
{
n = m-1;
break;
}
}
}
//***********************************************************
cout << "n = " << n << endl;
long sum = 2;
long s = 1;//上一个数的余数
long t;
for (i = 2; i <= n; i++)
{
t = i * s;
s = (t % m);
sum = (s + sum) % m;
}
cout << sum << endl;
}