日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】

發布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

給出一個區間[L,R][L,R],問該區間中所有以KK作為最小因子(大于11的)的數字之和

Input

第一行輸入一整數TT表示用例組數,每組用例輸入三個整數L,R,KL,R,K(1≤L≤R≤1011,2≤K≤1011)(1≤L≤R≤1011,2≤K≤1011)
Output

對于每組用例,輸出答案,結果模109+7109+7
Sample Input

2
1 20 5
2 6 3

Sample Output

Case #1: 5
Case #2: 3

先放網上的通解,就是大致的思路。

看題解看的心累。
然后是我寫的題解:

然后是代碼:

#include<bits/stdc++.h> using namespace std; typedef long long ll; #define mod 1000000007 #define inv2 500000004 const int Max=320000,Max_R=14000,cnt=5000; int tot=0,p[Max+5],flag[Max+5],dp[Max_R+5][cnt+5]; int ins(int x,int y) //防溢出加法 {return x+y>=mod?x+y-mod:x+y; } int des(int x,int y)//防溢出減法 {return x-y<0?x-y+mod:x-y; } void init() {for(int i=2;i<=Max;i++)if(!flag[i]){p[++tot]=i;for(int j=2*i;j<=Max;j+=i)flag[j]=1;}dp[0][0]=0;for(int i=1;i<=Max_R;i++){dp[i][0]=ins(dp[i-1][0],i);for(int j=1;j<=cnt;j++)dp[i][j]=des(dp[i][j-1],(ll)p[j]*dp[i/p[j]][j-1]%mod);} } bool check(ll n)//素數檢測 {for(int i=1;i<=tot&&(ll)p[i]*p[i]<=n;i++)if(n%p[i]==0)return 0;return 1; } int DFS(ll n,int m) {if(n<2)return n;if(m==0){n%=mod;return n*(n+1)%mod*inv2%mod;}if(n<=Max_R&&m<=cnt)return dp[n][m];//在IJ區間可以直接出答案if(n<=p[m])return 1;return des(DFS(n,m-1),(ll)p[m]*DFS(n/p[m],m-1)%mod);//不在IJ區間不能直接出答案 } int main() {init();int T,Case=1,pos;scanf("%d",&T);while(T--){ll L,R,K;scanf("%I64d%I64d%I64d",&L,&R,&K);printf("Case #%d: ",Case++);if(!check(K))printf("0\n");else if(K>Max){if(K>=L&&K<=R)printf("%d\n",K%mod);else printf("0\n");}else{for(pos=1;p[pos]<K;pos++);pos--;int ans=des(K*DFS(R/K,pos)%mod,K*DFS((L-1)/K,pos)%mod);printf("%d\n",ans);}}return 0; }

總結

以上是生活随笔為你收集整理的数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。