生活随笔
收集整理的這篇文章主要介紹了
数学--数论--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
];if(n
<=p
[m
])return 1;return des(DFS(n
,m
-1),(ll
)p
[m
]*DFS(n
/p
[m
],m
-1)%mod
);
}
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多校第九场】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。