ACM—ICPC 南京赛区网络预赛 A题—An Olympian Math Problem

  • 题目链接:https://nanti.jisuanke.com/t/30990
  • 题意:定义S=1×1!+2×2!+⋯+(n−1)×(n−1)!,求 S mod n的结果
  • 思路:看到这样大的数据,第一反应是找规律,而且看到AC人数不断增长,更确信,于是就把n在1~10之间的S mod n打表发现结果都是n-1。 而如果从数学角度出发,(n-1)*(n-1)! = n!-1,所以S = n!-1,则S mod n = (n!-1) mod n = n-1.
  • 代码:
#include "bits/stdc++.h"
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define fori(i,l,u) for(int i = l;i < u;i++)
#define forj(j,l,u) for(int j = l;j < u;j++)
#define pb push_back
#define mk make_pair
#define F first
#define S second
typedef long long  ll;
typedef pair<int, int> pi;
typedef pair<string,int> ps;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pi> vpi;
void init(){
    int t;
    ll n;
    cin>>t;
    while (t--) {
        cin>>n;
        cout<<n-1<<endl;
    }
}
int main()
{
    init();
    return 0;
}
  • 遇到的问题 :对于 (n!-1) mod n 等于多少这个问题,我纠结了一天。当然正常人肯定张口就来 n-1,但是弱智的我还是想了好多。 (n!-1) mod n = (n! mod n - 1 mod n) mod n = -1 mod n = n-1。 因为余数的定义是 n = k*p + r,余数不为负数,像上面那样算出来是 -1 ,即r = -1 ,那么k- -,r = n+(-1)。

猜你喜欢

转载自blog.csdn.net/qq_39763472/article/details/82356912
今日推荐