NC200625. 陪你去流浪,踏遍那四海八荒
描述
输入描述
多组输入
第一行输入n 表示初始神秘法宝是多少层的 (1<= n<=1e15)
第二行 输入 x 和 y 分别表示x瓶万生药水,y瓶万物归一 (0<= x ,y <= 10)
输出描述
每行输出通过万生药水和万物归一的变换之后,最后的神秘法宝的容积。同时容积对mod取余。
示例1
输入:
2 1 1 3 2 1
输出:
5 33
Java(javac 1.8) 解法, 执行用时: 69ms, 内存消耗: 11692K, 提交时间: 2020-04-11 15:07:07
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); long mod=3777105087l; long n[]=new long[200]; long m[]=new long[200]; n[1]=1; for(int i=2;i<200;i++) { n[i]=n[i-1]*i%mod; m[i]=(n[i]+m[i-1])%mod; } while(in.hasNext()) { long a=in.nextLong(); int x=in.nextInt(); int y=in.nextInt(); long ans=1; if(y>0) { for(int i=1;i<=x;i++) { ans=ans*2; } } if(a>178) { System.out.println(m[178]*ans%mod+1); } else { System.out.println(m[(int)a]*ans%mod+1); } } } }
C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 492K, 提交时间: 2020-04-11 17:01:27
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll mod=3777105087; ll f[180],s[180]; int main() { f[1]=1; for(int i=2;i<=178;i++){ f[i]=f[i-1]*i%mod; s[i]=(s[i-1]+f[i])%mod; } ll n; while(cin>>n) { int x,y; ll a=1; cin>>x>>y; if(y) a=1<<x; if(n>178) cout<<s[178]*a%mod+1<<endl; else cout<<s[n]*a%mod+1<<endl; } system("pause"); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 504K, 提交时间: 2020-07-15 14:10:21
#include<bits/stdc++.h> using namespace std; const long long mod=3777105087; long long i,ans,n,x,y,A[180],S[180]={0}; int main() { S[2]=A[2]=2; for(i=3;i<=177;i++)A[i]=A[i-1]*i%mod,S[i]=(S[i-1]+A[i])%mod; while(~scanf("%lld%lld%lld",&n,&x,&y)) { if(n>177)n=177; i=(1<<x),ans=(S[n]+1)%mod; if(y)ans=(S[n]*i+1)%mod; printf("%lld\n",ans); } return 0; }