結果

問題 No.502 階乗を計算するだけ
ユーザー vjudge1
提出日時 2025-02-22 21:52:15
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 1,271 bytes
コンパイル時間 1,715 ms
コンパイル使用メモリ 162,372 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2025-02-22 21:52:27
合計ジャッジ時間 12,336 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 47 TLE * 5
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
int main() {
    //freopen("factorial.in","r",stdin);
    //freopen("factorial.out","w",stdout);
    std::ios::sync_with_stdio(false),std::cin.tie(nullptr);
    long long n,i,ans1=1,ans2=1,ans3=1,ans4=1,ans5=1,ans6=1,ans7=1,ans8=1; const int Mod=1e9+7; const __int128 brt=((__int128)1<<64)/Mod;
    std::cin>>n;
    if(n>=Mod) return std::cout<<0,0;
    for(i=1;i+8<=n;i+=8) {
	    ans1*=i,ans2*=(i+1),ans3*=(i+2),ans4*=(i+3),ans5*=(i+4),ans6*=(i+5),ans7*=(i+6),ans8*=(i+7);
	    ans1=ans1-Mod*(brt*ans1>>64);
	    ans2=ans2-Mod*(brt*ans2>>64);
	    ans3=ans3-Mod*(brt*ans3>>64);
	    ans4=ans4-Mod*(brt*ans4>>64);
	    ans5=ans5-Mod*(brt*ans5>>64);
	    ans6=ans6-Mod*(brt*ans6>>64);
	    ans7=ans7-Mod*(brt*ans7>>64);
	    ans8=ans8-Mod*(brt*ans8>>64);
	    if(ans1>=Mod) ans1-=Mod;
	    if(ans2>=Mod) ans2-=Mod;
	    if(ans3>=Mod) ans3-=Mod;
	    if(ans4>=Mod) ans4-=Mod;
	    if(ans5>=Mod) ans5-=Mod;
	    if(ans6>=Mod) ans6-=Mod;
	    if(ans7>=Mod) ans7-=Mod;
	    if(ans8>=Mod) ans8-=Mod;
    }
    ans1=ans1*ans2%Mod;
    ans3=ans3*ans4%Mod;
    ans5=ans5*ans6%Mod;
    ans7=ans7*ans8%Mod;
    ans1=ans1*ans3%Mod;
    ans5=ans5*ans7%Mod;
    long long ans=ans1*ans5%Mod;
    for(;i<=n;i++) ans=ans*i%Mod;
    std::cout<<ans;
    return 0;
}
0