[NOIP2017模拟]Heal

来源:互联网 发布:淘宝中小卖家名单 编辑:程序博客网 时间:2024/05/20 10:20

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;}

本题结。

原创粉丝点击