2017.10.27 T3 2015
样例数据1
输入
2 3
输出
8
样例数据2
输入
8 8
输出
16711680
分析:T3很难,很难,难到你读不懂题,也就只难在读不懂题上。如果能读懂题目,这道题就是个容斥原理裸题,但是这道题TMD题面就是一篇记叙文,还是哲理类的!!!整道题的题面就占了一页,完全看不下去啊,而且在前面的题花的时间太多了,也没法慢慢理解这道题,就放弃了。
代码
不用看了,就是跳蚤加一个取模,优化了一下筛质数
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue>
#include<set>
using namespace std;
long long getlong()
{
long long sum=0,f=1;
char ch;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-')
{
f=-1;
ch=getchar();
}
for(;ch>='0'&&ch<='9';ch=getchar())
sum=(sum<<3)+(sum<<1)+ch-48;
return sum*f;
}
const int mo=1e9+7;
long long n,m,tot,sushu[55];
long long ans,tmp,a[55];
long long ksm(long long x,long long y)
{
long long res=1;x=x%mo;
for(;y;y=y>>1,x=x*x%mo)
if(y&1)
res=res*x%mo;
return res;
}
void dfs(int cnt,int step,int num)
{
if(step>num)
{
long long res=m;
for(int i=1;i<=num;++i)
res/=a[i];
tmp=(tmp+ksm(res,n))%mo;
return;
}
for(int i=cnt;i<=tot-num+step;++i)
{
a[step]=sushu[i];
dfs(i+1,step+1,num);
}
}
int main()
{
freopen("heal.in","r",stdin);
freopen("heal.out","w",stdout);
n=getlong(),m=getlong();
ans=ksm(m,n);
long long mm=m;
for(long long i=2;i*i<=mm;++i)//把O(n)的筛法改成了根号的筛法
if(mm%i==0)
{
sushu[++tot]=i;
while(mm%i==0)
mm/=i;
}
if(mm>1)
sushu[++tot]=mm;
for(int i=1;i<=tot;++i)
{
tmp=0;
dfs(1,1,i);
if(i&1)
ans=(ans+mo-tmp)%mo;
else
ans=(ans+tmp)%mo;
}
cout<<ans<<'\n';
return 0;
}
本题结。