%1e9+7问题收录

题目一:
问题描述:求一个序列(数组)所有非空子序列乘积之和。结果对 1000000007 取模。
 
#include <iostream>
#include <cstdio>
using namespace std;
const int M = 1e9 + 7;
#define ll long long
int main()
{
    int n;
    ll x, ans = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &x);
        ans += ans * x % M + x;
        ans %= M;
    }
    printf("%lld", ans);
    return 0;
}

看题目当成一道规划题了,没多想。

解题核心ans += ans * x % M + x

即每个数乘N次加它自身。

 
 
题目二:
链接:https://ac.nowcoder.com/acm/contest/11189/B
问题描述:求一个大数,每一位与每一位按位差值绝对值之和。如100-99=|1+0+0-9-9|=17
#include <iostream>
using namespace std;
const int mod = 1e9 + 7;
long long num[100005] = {0};
string R;
int main()
{
    int i, n, ans = 0;
    num[0] = 1, num[1] = 17;
    for (i = 2; i <= 1e5; i++)
        num[i] = (num[i - 1] * 10 + 9) % mod;
    cin >> R;
    n = R.length();
    for (i = 0; i < n; i++)
        ans = (ans + (R[i] - '0') * num[n - i - 1]) % mod;
    cout << (ans - 1 + mod) % mod;
    return 0;
}

  解题时考虑到了,除了进位时加的数字与众不同,其余全是1,然后推出了进位时的数字服从等差数列,但因为忽略了如110-109=8这种也算进位的情况所以跑偏了。然后我们再来欣赏一下python代码吧:

n = int(input())
a = n-1
n //= 10
c = 7
p = int(1E9+7)
while n > 0:
    a = a+c*n
    if c == 7:
        c = 9
    n //= 10
print(a % p)

  

 
猜测:大数阶乘,大数的排列组合等,一般都要求将输出结果对1e9+7取余.
(参考 https://blog.csdn.net/mlm5678/article/details/87910446  )
这类问题应该都是解题核心不会复杂,反复乘积。
posted @ 2021-03-28 16:34  anyiya  阅读(130)  评论(0编辑  收藏  举报