DUTOJ1207: Donuts!!!()

本文介绍了一种算法问题,即计算连续多天购买特定种类和类别的多纳圈的总费用,并通过模运算处理可能的大数值结果。提供了两种解决方案,一种使用前缀和方法,另一种利用求和公式结合逆元进行计算。

1207: Donuts!!!

Time Limit:5000/3000 MS (Java/Others)   Memory Limit:294912/262144 KB (Java/Others)
Total Submissions:204   Accepted:30

[Submit][Status][Discuss]

Description

Shinobu酷爱吃Mr. Donuts品牌的多纳圈。这个品牌的多纳圈有很多种很多类,其中第x种,第y类多纳圈的价格是xyxy元钱。

Shinobu很贪吃,她每次要从第k类多纳圈的第a种连着吃到第b种才能满足(不保证a≤ba≤b)。你现在已经通过某种手段预知了未来t天她要选择哪一类多纳圈,以及她要从第几种吃到第几种,因此你可以提前计算出总共的花费。

答案可能很大,输出答案模109+7109+7的值

t≤105,a,b≤2×106,k≤5t≤105,a,b≤2×106,k≤5

本题数据组数:4

 

Input

第一行包含一个整数,表示天数t。

接下来t行每行3个整数a,b,k,表示这一天她打算从第a种吃到第b种,多纳圈为第k类。

Output

一行一个整数,表示购买t天的多纳圈一共要花多少钱(对109+7109+7取模)。

Sample Input

1
1 1 1

Sample Output

1

HINT

 

正如Clar中第2个问题的回答,当b>a,是吃b,b-1,....a,而非不吃。

 

 

HINT

可以之前前缀和解决,像我一样首推求和公式用逆元求解的都是傻逼操作(虽然学长说碾压了标称),两个方法一个146ms一个2152ms

     #include<bits/stdc++.h>
using namespace std;
long long num[5][2000100];
const int mod=1000000007;
long long pp(long long a,int k)
{
long long now=a;
for(int i=1;i<k;i++)
{
now*=a;
now%=mod;
}
return now;
}
void yuchuli()
{
for(int i=0;i<5;i++)
{
for(int j=1;j<=2000010;j++)
{
num[i][j]=(num[i][j-1]+pp(j,i+1))%mod;
}
}
}
int main()
{
int t;
scanf("%d",&t);
yuchuli();long long ans=0;int a,b,k;
while(t--)
{
scanf("%d%d%d",&a,&b,&k);
if(a>b) swap(a,b);
ans+=num[k-1][b]-num[k-1][a-1];
ans%=mod;
}
printf("%lld\n",(ans+mod)%mod);
}     
    
             


    方法二

#include<bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
long long inv[100];
void get_inv()
{
    inv[1]=1;
    for(int i=2;i<=10;i++)
        inv[i]=(mod-(mod/i))*inv[mod%i]%mod;
}
long long pp(long long a,int b)
{long long now=a;
for(int i=1;i<b;i++)
{
now=(now*a)%mod;
}
return now;
}
long long jilu[10];
long long sum(long long n,int k)
{
if(jilu[k]!=0) return jilu[k];
if(n==0) return 0;
if(k==1)
{
jilu[k]=(((n*(n+1))%mod)*inv[2])%mod;
return jilu[k];
}
if(k==2)
{
jilu[k]=(((pp(n,3)+3*n*n+2*n-3*sum(n,1))%mod)*inv[3])%mod;
return jilu[k];
}
if(k==3)
{
jilu[k]=((((pp(n+1,4)-1-6*sum(n,2)-n-4*sum(n,1))%mod)*inv[4])%mod);
return jilu[k];
}
if(k==4)
{
// printf("%lld %lld %lld %lld",sum(n,2),sum(n,3),sum(n,4),sum(n,5));
jilu[k]=(((pp(n+1,5)-1-10*sum(n,3)-10*sum(n,2)-n-5*sum(n,1))%mod)*inv[5])%mod;
return jilu[k];
}
if(k==5)
{
jilu[k]=(((pp(n+1,6)-1-sum(n,4)*15-sum(n,3)*20-sum(n,2)*15-sum(n,1)*6-n)%mod)*inv[6])%mod;
return jilu[k]; 
}
}




int main()
{
int t,a,b,k;long long ans;
scanf("%d",&t);ans=0;
get_inv();
while(t--)
{
scanf("%d%d%d",&a,&b,&k);
if(a>b) swap(a,b);
if(a==b)
{
ans+=pp(a,k);
ans%=mod;
continue;
}
memset(jilu,0,sizeof(jilu));
long long aa=sum(b,k);
memset(jilu,0,sizeof(jilu));
long long bb=sum(a-1,k);
ans+=aa-bb;
ans%=mod;
// printf("%lld\n  ",sum(b,k));

}
printf("%lld\n",((ans+mod)%mod));
} 
    


   
    

源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方法。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线与曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统与缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插方法获得曲线**: - 插方法:依据关键帧信息,选用插方法(如线性插、样条插,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值