百度之星java大数+C++做法Strassen

Posted tangent-1231

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度之星java大数+C++做法Strassen相关的知识,希望对你有一定的参考价值。

技术图片

 

代码:递归搜索一下。java大数做法

import java.util.*;
import java.math.*;
import java.security.MessageDigest;

public class Main 
     static BigInteger s=BigInteger.ONE.add(BigInteger.ONE);
    public static void main(String[] args) 
        Scanner cin=new Scanner(System.in);
        int T;
        T=cin.nextInt();
        while(T-->0)
        
            BigInteger a,b,n;
            
            n=cin.nextBigInteger();
            a=cin.nextBigInteger();
            b=cin.nextBigInteger();
            BigInteger ans=cul(n,a,b).mod(BigInteger.valueOf(1000000007));
            System.out.println(ans);
            
        
    
    public static BigInteger cul(BigInteger n,BigInteger a,BigInteger b)
    
        if(n.equals(BigInteger.ONE))
        
            BigInteger sum1=n.multiply(n).multiply(n).multiply(b).add(n.subtract(BigInteger.ONE).multiply(n).multiply(n).multiply(a));
            return sum1;
        
        return min((n.divide(s)).multiply(n.divide(s)).multiply(BigInteger.valueOf(18)).multiply(a).add(cul(n.divide(s),a,b).multiply(BigInteger.valueOf(7))),n.multiply(n).multiply(n).multiply(b).add(n.subtract(BigInteger.ONE).multiply(n).multiply(n).multiply(a)));
    
    private static BigInteger min(BigInteger add, BigInteger add2) 
        // TODO Auto-generated method stub
        if(add.compareTo(add2)<0)
            return add;
        else return add2;
    

 

C++:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<cmath>
#include<string>
#include<map>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
#define mm(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const long long mod = 1e9 + 7;
const int maxn = 1e5 + 10;
const ll inf = 1e18;
ll a, b;
ll f1(ll n) 
    n %= mod;
    return (n*n%mod*n%mod*b%mod + n * n%mod*(n - 1) % mod*a%mod) % mod;

ll f2(ll n) 
    if (n % 2) return f1(n);
    if (n <= 30 * a / (a + b)) return f1(n);
    return (18 * (n / 2) % mod*(n / 2) % mod*a%mod + 7 * f2(n / 2) % mod) % mod;

int main()

    int t;
    ll n;
    cin >> t;
    while (t--)
    
        scanf("%lld%lld%lld", &n, &a, &b);
        printf("%lld\\n", f2(n));
    

 

以上是关于百度之星java大数+C++做法Strassen的主要内容,如果未能解决你的问题,请参考以下文章

百度之星2018 复赛 体验记

2018百度之星资格赛T2 子串查询

2017"百度之星"程序设计大赛 - 初赛(A)-1001.小C的倍数问题(HDU6108) 1005.今夕何夕-蔡勒公式 (HDU6112)

[SinGuLaRiTy] 百度之星程序设计大赛 初赛 1001 小C的倍数问题

2017百度之星初赛

HDU 6108 小C的倍数问题 数学 (2017"百度之星"程序设计大赛 - 初赛(A))