其實這道題目的難點不在容斥原理,在於大數越界、取餘等等的細節
首先求出通項公式為
n(2n+1)(n+1)(3n² +3n-1)/30
求(a/b)%mod有兩種方法
1、原式=a%(b*n)/b
2、原式=a*b^(phi(mod)-1)%mod;(其中b與mod互質)
本題中,由於mod過大,採用第一種方法會出錯,於是用了第二種方法。
容斥過程中比如要加上2的四次,4的四次,6的四次。。。。可把2的四次提取出來,另外一項就變成了四次方和了
view code
#include#include
#include
#include
using
namespace std;
const __int64 mod = 1000000007;
__int64 n;
__int64 power(__int64 a,__int64 b,__int64 c)
return ret;
}__int64 calc(__int64 n)
__int64 sici(__int64 n)
return sum;
}__int64 solve(__int64 r,__int64 n)
}if(r>1) p.push_back(r);
__int64 sum=0;
for(__int64 num=1;num
<1,ones=0;
for(i=0;iif(num&(1
=mod) mult%=mod;}}
if(ones%2) sum+=sici(mult)*calc(n/mult);
else sum-=sici(mult)*calc(n/mult);
sum%=mod;
}return sum;
}int main()
return
0;}
hdu 4336 容斥原理
按照解題報告的提示,用容斥原理實現 for int j bg 1 j另解 概率dp,康哥指導的 include include includeusing namespace std double f 1 21 gl 22 int main int i,j,k,n double fz,fm while...
hdu4135 容斥原理
題意 給出a,b,n,求出 a,b 範圍內與n互素的數字的個數。即b範圍內的不與n互素的數減去a範圍內不與n互素的數,把 1,a 1,b 中不與n互素的數分別求出來,再減掉就是和n互素的數了。那麼首先將n分解質因數,因子和因子的倍數可以被除盡,一定不與n互素,把這些數都記下來,篩法求素數即可 然後把...
hdu 4135 容斥原理
剛接觸,有關因子個數的增加不太弄得好,然後看到了這個神奇的遞迴 ac include includeusing namespace std define ll long long ll a,b,ansa,ansb,ans,p 100 up void dfs int n,bool tag,ll num...